Jak generować liczby losowe w Rubim

Chociaż żaden komputer nie jest w stanie wygenerować prawdziwie losowych liczb, Ruby zapewnia dostęp do metody, która powróci pseudolosowy liczby.

Żaden komputer nie może wygenerować naprawdę losowe liczby wyłącznie przez obliczenia. Najlepsze, co mogą zrobić, to wygenerować pseudolosowy liczby, które są ciągiem liczb, które zjawić się losowe, ale nie są.

Dla ludzkiego obserwatora liczby te są rzeczywiście losowe. Nie będzie krótkich powtarzających się sekwencji, a przynajmniej dla ludzkiego obserwatora nie będą one przedstawiać żadnego wyraźnego wzoru. Jednak biorąc pod uwagę wystarczającą ilość czasu i motywacji, oryginał nasionko można odkryć, odtworzyć sekwencję i odgadnąć kolejny numer w sekwencji.

Z tego powodu metody omówione w tym artykule prawdopodobnie nie powinny być używane do generowania liczb, które muszą być bezpieczne kryptograficznie.

Generatory liczb pseudolosowych muszą być zaszczepiony w celu wytworzenia sekwencji, które różnią się za każdym razem, gdy generowana jest nowa liczba losowa. Żadna metoda nie jest magiczna - te pozornie losowe liczby są generowane przy użyciu stosunkowo prostych algorytmów i stosunkowo prostej arytmetyki. Zaszczepiając PRNG, zaczynasz go w innym momencie za każdym razem. Gdybyś go nie zaszczepił, za każdym razem generowałby tę samą sekwencję liczb.

instagram viewer

W Ruby Jądro # srand metodę można wywoływać bez argumentów. Wybierze ziarno liczby losowej na podstawie czasu, identyfikatora procesu i numeru sekwencji. Po prostu dzwoniąc srand gdziekolwiek na początku programu, za każdym razem będzie generował inną serię pozornie losowych liczb. Ta metoda jest wywoływana niejawnie podczas uruchamiania programu i wysyła PRNG z czasem i identyfikatorem procesu (bez numeru sekwencji).

Po uruchomieniu programu i Jądro # srand został nazwany pośrednio lub jawnie Jądro # rand można wywołać metodę Ta metoda, wywołana bez argumentów, zwróci losową liczbę od 0 do 1. W przeszłości liczba ta była zwykle skalowana do maksymalnej liczby, którą chciałbyś wygenerować i być może to_i wywołał go, aby przekonwertować go na liczbę całkowitą.

Jednak Ruby ułatwia korzystanie z Ruby 1.9.x. The Jądro # rand Metoda może przyjąć pojedynczy argument. Jeśli ten argument to Numeryczne dowolnego rodzaju, Ruby wygeneruje liczbę całkowitą od 0 do tej liczby (bez uwzględnienia).

Co jednak, jeśli chcesz wygenerować liczbę od 10 do 15? Zazwyczaj generujesz liczbę od 0 do 5 i dodajesz ją do 10. Jednak Ruby to ułatwia.

Pamiętaj, aby zwrócić uwagę na dwa typy zakresów. Jeśli zadzwoniłeś rand (10..15), generowałoby to liczbę od 10 do 15 włącznie z 15. Natomiast rand (10... 15) (z 3 kropkami) wygenerowałby liczbę od 10 do 15 nie licząc 15.

Czasami potrzebujesz losowo wyglądającej sekwencji liczb, ale za każdym razem musisz wygenerować tę samą sekwencję. Na przykład, jeśli generujesz liczby losowe w teście jednostkowym, powinieneś generować tę samą sekwencję liczb za każdym razem.

Test jednostkowy, który nie powiedzie się na jednej sekwencji, powinien się nie powieść przy następnym uruchomieniu, jeśli następnym razem wygeneruje sekwencję różnic, może się nie powieść. Aby to zrobić, zadzwoń Jądro # srand o znanej i stałej wartości.

Implementacja Jądro # rand jest raczej nie-Ruby. W żaden sposób nie wyodrębnia PRNG, ani nie pozwala na tworzenie PRNG. Istnieje jeden stan globalny dla PRNG, który dzieli wszystkie kody. Jeśli zmienisz ziarno lub w inny sposób zmienisz stan PRNG, może on mieć szerszy zakres działania, niż się spodziewałeś.

Ponieważ jednak programy oczekują, że wynik tej metody będzie losowy - taki jest jej cel! - prawdopodobnie nigdy nie będzie to problemem. Tylko jeśli program spodziewa się zobaczyć oczekiwaną sekwencję liczb, taką jak gdyby zadzwonił srand ze stałą wartością, jeśli zobaczy nieoczekiwane wyniki.