Ako generovať náhodné čísla v Ruby

Zatiaľ čo žiadny počítač nedokáže generovať skutočne náhodné čísla, Ruby neposkytuje prístup k metóde, ktorá sa vráti pseudorandom Čísla.

Žiadny počítač nemôže skutočne generovať náhodné čísla čisto výpočtom. To najlepšie, čo môžu urobiť, je vygenerovať pseudorandom čísla, ktoré sú postupnosťou čísel javí náhodné, ale nie sú.

Pre ľudského pozorovateľa sú tieto čísla skutočne náhodné. Nebudú existovať žiadne krátke opakujúce sa sekvencie a aspoň ľudskému pozorovateľovi nebudú predstavovať žiadny jasný vzorec. Avšak, vzhľadom na dostatok času a motivácie, originál semienko môže byť objavená, sekvencia znovu vytvorená a ďalšie číslo v sekvencii uhádnuté.

Z tohto dôvodu by sa metódy uvedené v tomto článku pravdepodobne nemali používať na generovanie čísel, ktoré musia byť kryptograficky bezpečné.

Generátory pseudonáhodných čísel musia byť naočkuje aby sa vytvorili sekvencie, ktoré sa líšia zakaždým, keď sa vygeneruje nové náhodné číslo. Žiadna metóda nie je magická - tieto zdanlivo náhodné čísla sa generujú pomocou relatívne jednoduchých algoritmov a relatívne jednoduchých aritmetických metód. S nasadením PRNG sa začína vždy v inom bode. Ak by ste to nenaseli, vygenerovalo by sa vždy rovnaké poradie čísel.

instagram viewer

V Ruby, USA Jadro # srand metódu nemožno zavolať bez argumentov. Vyberie osivo náhodných čísel na základe času, ID procesu a poradového čísla. Jednoducho zavolaním srand kdekoľvek na začiatku programu, pri každom spustení vygeneruje inú sériu zdanlivo náhodných čísel. Táto metóda sa nazýva implicitne pri spustení programu a zaočkuje PRNG časom a ID procesu (bez poradového čísla).

Akonáhle je program spustený a Jadro # srand bol implicitne alebo výslovne nazvaný Jadro # rand metódu možno nazvať. Táto metóda, volaná bez argumentov, vráti náhodné číslo od 0 do 1. V minulosti bolo toto číslo zvyčajne upravené na maximálny počet, ktorý by ste chceli generovať to_i vyzval ho, aby ho previedol na celé číslo.

Ruby vám však veci trochu uľahčí, ak používate Ruby 1.9.x. Jadro # rand metóda môže mať jeden argument. Ak je toto tvrdenie a číselná akéhokoľvek druhu, Ruby vygeneruje celé číslo od 0 do (a bez) tohto čísla.

Čo ak však chcete vygenerovať číslo od 10 do 15? Spravidla by ste vygenerovali číslo od 0 do 5 a pridali ho k 10. Ruby to však uľahčuje.

Nezabudnite venovať pozornosť dvom typom rozsahov. Ak ste volali rand (10..15), ktoré by vygenerovali číslo od 10 do 15 počítajúc do toho 15. kdežto rand (10... 15) (s 3 bodkami) by vygenerovalo číslo od 10 do 15 nezahrňuje 15.

Niekedy potrebujete náhodne vyzerajúcu sekvenciu čísel, ale musíte vygenerovať rovnakú sekvenciu zakaždým. Napríklad, ak generujete náhodné čísla v teste jednotky, mali by ste vygenerovať vždy rovnakú sekvenciu čísel.

Test jednotky, ktorý zlyhá pri jednej sekvencii, by mal znova zlyhať pri ďalšom spustení, ak pri nasledujúcom vygenerovaní sekvencie rozdielov zlyhá. Ak to chcete urobiť, zavolajte Jadro # srand so známou a konštantnou hodnotou.

Vykonávanie Jadro # rand je skôr ne-Ruby. Žiadnym spôsobom neregistruje PRNG ani neumožňuje vytvoriť inštanciu PRNG. Existuje jeden globálny stav pre PRNG, ktorý zdieľajú všetky kódy. Ak zmeníte semeno alebo inak zmeníte stav PRNG, môže to mať širšiu škálu účinkov, ako ste očakávali.

Pretože však programy očakávajú, že výsledok tejto metódy bude náhodný - to je jeho účel! - toto pravdepodobne nebude nikdy problém. Iba v prípade, že program očakáva, že uvidí očakávanú postupnosť čísel, napríklad ak zavolá srand s konštantnou hodnotou, ak by došlo k neočakávaným výsledkom.

instagram story viewer