Kuidas genereerida juhuslikke numbreid rubiinis

click fraud protection

Kuigi ükski arvuti ei suuda genereerida tõeliselt juhuslikke numbreid, pakub Ruby juurdepääsu meetodile, mis naaseb pseudorandom numbrid.

Ükski arvuti ei suuda tõeliselt genereerida juhuslikud numbrid puhtalt arvutamise teel. Parim, mida nad teha saavad, on genereerida pseudorandom numbrid, mis on arvude jada, mis ilmuma juhuslikud, kuid ei ole.

Inimvaatleja jaoks on need numbrid tõepoolest juhuslikud. Lühikesi korduvaid järjestusi ei tule ja vähemalt inimese vaatleja jaoks ei anna nad selget mustrit. Piisava aja ja motivatsiooni olemasolul on see siiski originaalne seeme saab avastada, jada uuesti luua ja jada järgmine number ära arvata.

Sel põhjusel ei tohiks arvatavasti käesolevas artiklis käsitletud meetodeid kasutada numbrite genereerimiseks, mis peavad olema krüptograafiliselt turvalised.

Pseudo-juhuslike arvude generaatorid peavad olema külvatud et luua järjestusi, mis erinevad iga kord, kui genereeritakse uus juhuslik arv. Ükski meetod pole maagiline - need näiliselt juhuslikud numbrid genereeritakse suhteliselt lihtsate algoritmide ja suhteliselt lihtsa aritmeetika abil. PRNG külvamisega alustate seda iga kord teistsugusest kohast. Kui te seda ei seemneks, genereerib see iga kord sama numbrijada.

instagram viewer

Ruby, Kernel # srand meetodit saab nimetada argumentideta. See valib juhusliku arvu seemne aja, protsessi ID ja järjenumbri põhjal. Lihtsalt helistades srand ükskõik kus programmi alguses genereerib see iga kord, kui käivitate, erinevat näiliselt juhuslike arvude seeriat. Seda meetodit nimetatakse kaudselt programmi käivitamisel ja see annab PRNG-le aja ja protsessi ID (järjenumbrit pole).

Kui programm töötab ja Kernel # srand kutsuti kas kaudselt või otseselt, Kernel # rand meetodit võib nimetada. See meetod, mida nimetatakse argumentideta, tagastab juhusliku arvu 0-1. Varem oli see arv tavaliselt skaleeritud maksimaalsele arvule, mida soovite genereerida, ja võib-olla to_i kutsus seda täisarvuks teisendamiseks.

Ruby muudab asja pisut lihtsamaks, kui kasutate Ruby 1.9.x. Kernel # rand meetod võib võtta ühe argumendi. Kui see argument on a Numbriline ükskõik millist laadi, genereerib Ruby täisarv vahemikus 0 kuni (ja ei sisalda) seda arvu.

Mis aga saab, kui soovite genereerida arvu 10–15? Tavaliselt genereeriksite arvu vahemikus 0 kuni 5 ja lisate selle arvule 10. Ruby teeb selle siiski lihtsamaks.

Pöörake kindlasti tähelepanu kahte tüüpi vahemikele. Kui sa helistasid rand (10..15), mis genereeriks arvu 10–15 kaasa arvatud 15. Arvestades, et rand (10... 15) (3 punktiga) genereeriks arvu 10-15 välja arvatud 15.

Mõnikord vajate juhuslikku numbrijada, kuid peate genereerima sama jada iga kord. Näiteks kui genereerite ühikatses juhuslikke numbreid, peaksite iga kord genereerima sama numbrijada.

Ühel testil ebaõnnestuv ühiskatse peaks järgmisel käivitamisel uuesti ebaõnnestuma. Kui järgmine kord genereeriti erinevuste jada, ei pruugi see nurjuda. Selleks helistage Kernel # srand teadaoleva ja püsiva väärtusega.

Programmi rakendamine Kernel # rand on üsna un-Ruby. See ei abstrakteeri PRNG-d mingil moel ega luba teil PRNG-d koheseerida. PRNG-l on üks globaalne olek, mida kõik kood jagavad. Kui muudate seemet või muudate muul viisil PRNG olekut, võib selle mõju olla laiem, kui oskasite oodata.

Kuna aga programmid eeldavad, et selle meetodi tulemus on juhuslik - see on selle eesmärk! - see ei ole tõenäoliselt kunagi probleem. Ainult siis, kui programm loodab näha eeldatavat numbrijada, näiteks kui ta oleks helistanud srand püsiväärtusega, kas see peaks nägema ootamatuid tulemusi.

instagram story viewer