Selv om ingen datamaskiner kan generere virkelig tilfeldige tall, gir Ruby tilgang til en metode som vil returnere pseudo tall.
Ingen datamaskiner kan generere virkelig tilfeldige tall rent ved beregning. Det beste de kan gjøre er å generere pseudo tall, som er en sekvens av tall som vises tilfeldig, men er ikke.
For en menneskelig observatør er disse tallene tilfeldig. Det vil ikke være noen korte repeterende sekvenser, og i det minste for den menneskelige observatøren vil de ikke presentere noe klart mønster. Imidlertid gitt nok tid og motivasjon, originalen frø kan bli oppdaget, gjenskapt sekvensen og neste nummer i sekvensen gjettet.
Av denne grunn bør metodene som er omtalt i denne artikkelen, sannsynligvis ikke brukes til å generere tall som må være kryptografisk sikre.
Pseudorandom antall generatorer må være seeded for å produsere sekvenser som er forskjellige hver gang et nytt tilfeldig tall blir generert. Ingen metode er magisk - disse tilsynelatende tilfeldige tall genereres ved hjelp av relativt enkle algoritmer og relativt enkel aritmetikk. Ved å se på PRNG starter du den på et annet punkt hver gang. Hvis du ikke frø den, ville den generert den samme sekvensen med tall hver gang.
I Ruby, the Kernel # srand metoden kan kalles uten argumenter. Den vil velge et tilfeldig tallfrø basert på tid, prosess-ID og et sekvensnummer. Bare ved å ringe srand hvor som helst i begynnelsen av programmet ditt, vil det generere en annen serie tilsynelatende tilfeldige tall hver gang du kjører det. Denne metoden kalles implisitt når programmet starter, og frøer PRNG med tid og prosess-ID (ingen sekvensnummer).
Når programmet kjører og Kernel # srand ble enten implisitt eller eksplisitt kalt, the Kernel # rand metode kan kalles. Denne metoden, kalt uten argumenter, vil returnere et tilfeldig tall fra 0 til 1. Tidligere ble dette tallet vanligvis skalert til det maksimale antallet du ønsker å generere og kanskje to_i ba den om å konvertere den til et helt tall.
Imidlertid gjør Ruby ting litt enklere hvis du bruker Ruby 1.9.x. De Kernel # rand metoden kan ta et enkelt argument. Hvis dette argumentet er a numerisk av noe slag, vil Ruby generere et helt tall fra 0 opp til (og ikke inkludert) det tallet.
Hva om du vil generere et tall fra 10 til 15? Vanligvis vil du generere et tall fra 0 til 5 og legge det til 10. Imidlertid gjør Ruby det enklere.
Forsikre deg om at du tar hensyn til de to sortimentene. Hvis du ringte rand (10..15), som ville generere et tall fra 10 til 15 gjelder også 15. mens rand (10... 15) (med 3 prikker) ville generere et tall fra 10 til 15 ikke inkludert 15.
Noen ganger trenger du en tilfeldig serien med tall, men trenger å generere den samme sekvensen hver gang. Hvis du for eksempel genererer tilfeldige tall i en enhetstest, bør du generere den samme sekvensen med tall hver gang.
En enhetstest som mislykkes i en sekvens, skal mislykkes igjen neste gang den kjøres. Hvis den genererte en forskjellsekvens neste gang, kan den kanskje ikke mislykkes. For å gjøre det, ring Kernel # srand med en kjent og konstant verdi.
Gjennomføringen av Kernel # rand er ganske un-Ruby. Det abstraherer ikke PRNG på noen måte, og lar deg heller ikke opprette PRNG. Det er en global stat for PRNG som alle koden deler. Hvis du bytter frø eller på annen måte endrer tilstanden til PRNG, kan det ha et større virkningsområde enn du forventet.
Men siden programmer forventer at resultatet av denne metoden skal være tilfeldig - det er dets formål! - dette vil sannsynligvis aldri være et problem. Bare hvis programmet forventer å se en forventet rekkefølge av tall, for eksempel om det hadde ringt srand med en konstant verdi, skulle den se uventede resultater.