Hogyan generálhat véletlenszerű számokat a Ruby-ban

click fraud protection

Bár egyetlen számítógép sem képes valóban véletlenszerű számokat generálni, a Ruby hozzáférést biztosít egy olyan módszerhez, amely visszatér pszeudo- számokat.

Egyik számítógép sem képes valóban generálni véletlen számok tisztán számítás útján. A legjobb, amit tehetnek, hogy előállítsanak pszeudo- számok, amelyek egy számsorozatot alkotnak megjelenik véletlenszerűen, de nem.

Egy emberi megfigyelő számára ezek a számok valóban véletlenszerűek. Nem lesznek rövid ismétlődő sorozatok, és legalább az emberi megfigyelő számára nem mutatnak világos képet. Elegendő idő és motiváció mellett azonban az eredeti mag felfedezhető, a sorozat újra létrehozható, és a sorozat következő száma kitalálható.

Ezért a cikkben tárgyalt módszereket valószínűleg nem szabad olyan számok előállításához használni, amelyeknek kriptográfiailag biztonságosnak kell lenniük.

Az ál-véletlenszerű szám-generátoroknak be kell lenniük oltottuk annak érdekében, hogy olyan szekvenciákat állítsunk elő, amelyek minden egyes alkalommal különböznek egy új véletlenszám előállításáról. Egyik módszer sem varázslatos - ezeket a látszólag véletlenszerű számokat viszonylag egyszerű algoritmusok és viszonylag egyszerű számtani módszerrel állítják elő. A PRNG vetésével minden alkalommal más helyről indítja el. Ha nem vetné be, minden alkalommal ugyanazt a sorsort generálja.

instagram viewer

A Rubyban a Kernel # srand A metódus érvek nélkül meghívható. Az idő, a folyamat azonosítója és a sorszám alapján kiválaszt egy véletlenszerű számot. Egyszerűen hívással srand bárhol a program elején, a látszólag véletlenszerű számok sorozatát generálja minden alkalommal, amikor futtatja. Ezt a módszert implicit módon hívják meg, amikor a program elindul, és a PRNG-t idõ- és folyamat-azonosítóval (sorszám nélkül) helyezi el.

Amint a program fut és Kernel # srand vagy implicit, vagy explicit módon nevezték el Kernel # rand módszer hívható. Ez a argumentum nélkül hívott módszer véletlenszerű számot ad vissza 0-ról 1-re. A múltban ezt a számot általában a maximális számra méretezték, amelyet létrehozni kíván, és talán to_i felszólította egész számra konvertálására.

A Ruby azonban megkönnyíti a dolgokat, ha a Ruby 1.9.x-et használja. Az Kernel # rand A módszer egyetlen érvet is felvehet. Ha ez az érv a numerikus bármilyen fajta, Ruby egész számot generál 0-tól (és nem tartalmazza) az adott számig.

Mi lenne, ha 10-15-es számot szeretne generálni? Általában egy 0-tól 5-ig terjedő számot generál, és hozzáadja a 10-ig. A Ruby azonban megkönnyíti.

Ügyeljen a kétféle tartományra. Ha hívtál rand (10..15), ez 10 és 15 közötti számot generál beleértve 15. mivel rand (10... 15) (3 ponttal) 10 és 15 közötti számot generál kivéve 15.

Időnként szükség van egy véletlenszerűen megjelenő számsorozatra, de mindig ugyanazt a sorozatot kell generálnia. Például, ha véletlenszerű számokat generál egy egységtesztben, akkor minden alkalommal ugyanazt a számsort kell generálnia.

Az egy olyan teszt, amelyik sikertelen egy szekvencián, a következő futtatáskor ismét sikertelen lesz, ha a következő alkalommal eltérési szekvenciát generált, akkor valószínűleg nem fog sikertelen. Ehhez hívja Kernel # srand ismert és állandó értékkel.

A program végrehajtása Kernel # rand inkább un-Ruby. A PRNG semmilyen módon nem absztrakt, és nem engedi meg, hogy a PRNG utólagosan megjelenjen. A PRNG-nek egy globális állapota van, amelyet az összes kód megoszt. Ha megváltoztatja a vetőmagot, vagy egyéb módon megváltoztatja a PRNG állapotát, akkor a hatása szélesebb lehet, mint várták.

Mivel azonban a programok arra számítanak, hogy ennek a módszernek az eredménye véletlenszerű - ez a célja! - ez valószínűleg soha nem lesz probléma. Csak akkor, ha a program elvárja, hogy láthassa a várt számsort, például ha hívta volna srand állandó értéken, ha váratlan eredményeket lát.

instagram story viewer