Selvom ingen computere kan generere virkelig tilfældige tal, giver Ruby adgang til en metode, der vil vende tilbage pseudorandom numre.
Ingen computere kan generere virkelig tilfældige tal rent ved beregning. Det bedste, de kan gøre, er at generere pseudorandom tal, som er en række af numre, der komme til syne tilfældige, men er ikke.
For en menneskelig observatør er disse tal faktisk tilfældige. Der vil ikke være nogen korte gentagne sekvenser, og i det mindste for den menneskelige observatør vil de ikke præsentere noget klart mønster. Dog givet nok tid og motivation, originalen frø kan opdages, genskabes sekvensen og det næste nummer i sekvensen gættes.
Af denne grund bør metoderne, der diskuteres i denne artikel, sandsynligvis ikke bruges til at generere tal, der skal være kryptografisk sikre.
Pseudorandom-nummergeneratorer skal være seedet for at producere sekvenser, der er forskellige hver gang der genereres et nyt tilfældigt tal. Ingen metode er magisk - disse tilsyneladende tilfældige tal genereres ved hjælp af relativt enkle algoritmer og relativt enkel aritmetik. Ved at pode PRNG'en starter du den på et andet tidspunkt hver gang. Hvis du ikke frøede det, ville det generere den samme række af numre hver gang.
I Ruby, the Kernel # srand metoden kan kaldes uden argumenter. Det vælger et tilfældigt talfrø baseret på tid, proces-id og et sekvensnummer. Bare ved at ringe srand hvor som helst i begyndelsen af dit program, vil det generere en anden række tilsyneladende tilfældige tal, hver gang du kører det. Denne metode kaldes implicit, når programmet starter, og frøer PRNG'en med tids- og proces-ID (intet sekvensnummer).
Når programmet kører og Kernel # srand blev enten implicit eller eksplicit kaldet, the Kernel # rand metode kan kaldes. Denne metode, der kaldes uden argumenter, returnerer et tilfældigt tal fra 0 til 1. Tidligere blev dette nummer typisk skaleret til det maksimale antal, du ønsker at generere og måske to_i opfordrede det til at konvertere det til et heltal.
Imidlertid gør Ruby tingene lidt lettere, hvis du bruger Ruby 1.9.x. Det Kernel # rand metoden kan tage et enkelt argument. Hvis dette argument er et Numerisk af enhver art genererer Ruby et helt tal fra 0 op til (og ikke medtaget) dette nummer.
Hvad nu, hvis du vil generere et tal fra 10 til 15? Typisk genererer du et tal fra 0 til 5 og tilføjer det til 10. Ruby gør det dog lettere.
Sørg for at være opmærksom på de to typer af intervaller. Hvis du ringede rand (10..15), der ville generere et tal fra 10 til 15 inklusive 15. ud fra følgende betragtninger rand (10... 15) (med 3 prikker) ville generere et tal fra 10 til 15 ikke inklusive 15.
Nogle gange har du brug for en tilfældig ser sekvens af tal, men skal generere den samme sekvens hver gang. For eksempel, hvis du genererer tilfældige tal i en enhedstest, skal du generere den samme række af numre hver gang.
En enhedstest, der mislykkes i en sekvens, skal mislykkes igen, næste gang den køres, hvis den genererede en forskelssekvens næste gang, mislykkes den muligvis ikke. For at gøre det, ring Kernel # srand med en kendt og konstant værdi.
Implementeringen af Kernel # rand er snarere un-Ruby. Det abstraherer ikke PRNG på nogen måde, og det giver dig heller ikke mulighed for at instantiere PRNG. Der er en global stat for PRNG, som alle koder deler. Hvis du skifter frø eller på anden måde ændrer tilstanden af PRNG, kan det have et større interval af effekt, end du forventede.
Da programmer imidlertid forventer, at resultatet af denne metode er tilfældigt - det er dens formål! - dette vil sandsynligvis aldrig være et problem. Kun hvis programmet forventer at se en forventet rækkefølgen af numre, såsom hvis det havde ringet srand med en konstant værdi, hvis den kunne se uventede resultater.