Kuinka luoda satunnaislukuja rubiiniin

click fraud protection

Vaikka mikään tietokone ei pysty tuottamaan todella satunnaislukuja, Ruby tarjoaa pääsyn menetelmälle, joka palaa pseudorandom numeroita.

Mikään tietokone ei voi tuottaa todella satunnaislukuja puhtaasti laskennalla. Paras, mitä he voivat tehdä, on tuottaa pseudorandom numerot, jotka ovat numerojonoja, jotka ilmestyä satunnainen, mutta ei ole.

Ihmisen tarkkailijalle nämä luvut ovat todella satunnaisia. Ei tule olemaan lyhyitä toistuvia sekvenssejä, ja ainakaan ihmisen tarkkailijalle ne eivät anna selkeää mallia. Alkuperäinen kuitenkin, koska riittävästi aikaa ja motivaatiota siemen voidaan löytää, sekvenssi luoda uudelleen ja sekvenssin seuraava numero arvata.

Tästä syystä tässä artikkelissa käsiteltyjä menetelmiä ei todennäköisesti pitäisi käyttää luomaan numeroita, joiden on oltava salausteknisesti varmoja.

Näennäissatunnaismäärägeneraattorien on oltava kylvetään sekvenssien tuottamiseksi, jotka eroavat toisistaan ​​joka kerta kun uusi satunnaisluku generoidaan. Mikään menetelmä ei ole maaginen - nämä näennäisesti satunnaiset numerot luodaan suhteellisen yksinkertaisia ​​algoritmeja ja suhteellisen yksinkertaisia ​​aritmeettisia menetelmiä käyttämällä. Istuttamalla PRNG: n, aloitat sen eri kohdasta joka kerta. Jos et siemennyt sitä, se tuottaa saman numerosarjan joka kerta.

instagram viewer

Julkaisussa Ruby, the Kernel # SRAND menetelmää voidaan kutsua ilman argumentteja. Se valitsee satunnaislukumäärän ajan, prosessin tunnuksen ja järjestysnumeron perusteella. Yksinkertaisesti soittamalla SRAND missä tahansa ohjelman alussa, se tuottaa erilaisen näennäisesti satunnaislukujen sarjan joka kerta, kun suoritat sitä. Tätä menetelmää kutsutaan implisiittisesti, kun ohjelma käynnistyy, ja siementaa PRNG: n aika- ja prosessotunnuksella (ei sekvenssinumeroa).

Kun ohjelma on käynnissä ja Kernel # SRAND kutsuttiin joko epäsuorasti tai nimenomaisesti Kernel # Rand menetelmää voidaan kutsua. Tämä menetelmä, jota kutsutaan ilman argumentteja, palauttaa satunnaisluvun välillä 0 - 1. Aikaisemmin tämä numero oli yleensä skaalattu enimmäismäärään, jonka haluat luoda ja ehkä to_i kehotti sitä muuntamaan kokonaisluvuksi.

Ruby tekee asioista kuitenkin hieman helpompaa, jos käytät Ruby 1.9.x. Kernel # Rand menetelmä voi ottaa yhden argumentin. Jos tämä argumentti on a numeerinen minkä tahansa tyyppinen, Ruby tuottaa kokonaisluvun välillä 0 - (lukuun ottamatta) kyseistä lukua.

Entä jos kuitenkin haluat luoda luvun 10-15? Yleensä generoit luvun välillä 0 - 5 ja lisäät sen arvoon 10. Ruby kuitenkin helpottaa.

Varmista, että kiinnität huomiota kahden tyyppisiin alueisiin. Jos soitit rand (10..15), joka tuottaisi luvun 10-15 mukaan lukien 15. taas rand (10... 15) (3 pisteellä) tuottaisi luvun 10-15 ei sisällä 15.

Joskus tarvitset satunnaisen näköisen numerosarjan, mutta sinun on generoitava sama sekvenssi joka kerta. Esimerkiksi, jos luot satunnaislukuja yksikkötestissä, sinun pitäisi luoda sama numerosarja joka kerta.

Yksikkötesti, joka epäonnistuu yhdellä sekvenssillä, pitäisi epäonnistua uudelleen seuraavan kerran suoritettaessa, jos se tuotti erojakson seuraavalla kerralla, se ei ehkä epäonnistu. Soita siihen Kernel # SRAND jolla on tunnettu ja vakio arvo.

Toteutus Kernel # Rand on melko un-Ruby. Se ei abstrakti PRNG: tä millään tavalla, eikä se myöskään anna sinun suorittaa PRNG: tä. PRNG: llä on yksi maailmanlaajuinen tila, jonka kaikki koodit jakavat. Jos muutat siemeniä tai muutat PRNG-tilaa muuten, sillä voi olla laajempi vaikutusalue kuin odotit.

Koska ohjelmat odottavat tämän menetelmän tuloksen olevan sattumanvaraista - se on sen tarkoitus! - tämä ei todennäköisesti koskaan ole ongelma. Vain jos ohjelma odottaa näkevänsä odotetun numerosarjan, kuten jos se olisi soittanut SRAND vakioarvolla, jos siinä näkyy odottamattomia tuloksia.

instagram story viewer