Jak generovat náhodná čísla v Ruby

Zatímco žádný počítač nemůže generovat skutečně náhodná čísla, Ruby neposkytuje přístup k metodě, která se vrátí pseudonáhodný čísla.

Žádný počítač nemůže generovat skutečně náhodná čísla čistě výpočtem. To nejlepší, co mohou udělat, je vygenerovat pseudonáhodný čísla, což je posloupnost čísel objevit náhodné, ale nejsou.

Lidskému pozorovateli jsou tato čísla skutečně náhodná. Nebudou žádné krátké opakující se sekvence a přinejmenším pro lidského pozorovatele nebudou mít žádný jasný vzor. Nicméně, vzhledem k dost času a motivaci, originál semínko může být objevena, sekvence znovu vytvořena a další číslo v sekvenci uhodnuto.

Z tohoto důvodu by metody uvedené v tomto článku pravděpodobně neměly být použity ke generování čísel, která musí být kryptograficky bezpečná.

Generátory pseudonáhodných čísel musí být nasazený za účelem vytvoření sekvencí, které se liší pokaždé, když se vygeneruje nové náhodné číslo. Žádná metoda není magická - tato zdánlivě náhodná čísla jsou generována pomocí relativně jednoduchých algoritmů a relativně jednoduchých aritmetických metod. Zasazením PRNG se pokaždé začínáte v jiném bodě. Pokud byste to nenaseli, vygenerovalo by se pokaždé stejnou posloupnost čísel.

instagram viewer

V Ruby, Jader # srand metodu lze volat bez argumentů. Vybere semeno náhodných čísel na základě času, ID procesu a pořadového čísla. Jednoduše voláním hloupý kdekoli na začátku programu, vygeneruje při každém spuštění jinou řadu zdánlivě náhodných čísel. Tato metoda se nazývá implicitně při spuštění programu a zařadí PRNG časem a ID procesu (žádné pořadové číslo).

Jakmile je program spuštěn a Jader # srand byl buď implicitně nebo explicitně nazýván Jádro # rand metodu lze nazvat. Tato metoda, volaná bez argumentů, vrátí náhodné číslo od 0 do 1. V minulosti bylo toto číslo obvykle upraveno na maximální počet, který byste chtěli vygenerovat, a možná to_i vyzval ji, aby ji převedla na celé číslo.

Pokud však Ruby používáte 1.9.x, Ruby vám to trochu usnadní. Jádro # rand metoda může mít jediný argument. Pokud je tento argument a Numerické jakéhokoli druhu, Ruby vygeneruje celé číslo od 0 do (a bez) tohoto čísla.

Co když však chcete vygenerovat číslo od 10 do 15? Obvykle byste vygenerovali číslo od 0 do 5 a přidali je k 10. Ruby to však usnadňuje.

Nezapomeňte věnovat pozornost dvěma typům rozsahů. Pokud jste volali rand (10..15), které by generovalo číslo od 10 do 15 počítaje v to 15. Zatímco rand (10... 15) (se 3 tečkami) by vygenerovalo číslo od 10 do 15 neobsahuje 15.

Někdy potřebujete náhodně vyhlížející sekvenci čísel, ale musíte vygenerovat stejnou sekvenci pokaždé. Například pokud generujete náhodná čísla v testu jednotky, měli byste vygenerovat vždy stejnou sekvenci čísel.

Test jednotky, který selže v jedné sekvenci, by měl znovu selhat při příštím spuštění, pokud při příštím vygenerování sekvence rozdílů selže. Chcete-li to provést, volejte Jader # srand se známou a konstantní hodnotou.

Implementace Jádro # rand je poněkud ne-Ruby. V žádném případě neregistruje PRNG ani neumožňuje instanci PRNG. Existuje jeden globální stav pro PRNG, který sdílí všechny kódy. Pokud změníte semeno nebo jinak změníte stav PRNG, může to mít širší rozsah účinku, než jste očekávali.

Protože však programy očekávají, že výsledek této metody bude náhodný - to je jeho účel! - to pravděpodobně nebude nikdy problém. Pouze v případě, že program očekává, že uvidí očekávanou posloupnost čísel, jako kdyby to volal hloupý s konstantní hodnotou, pokud by viděl neočekávané výsledky.

instagram story viewer