Mam dość duży program, w którym używam funkcji z random
modułu w różnych plikach. Chciałbym móc raz ustawić losowe ziarno w jednym miejscu, aby program zawsze zwracał te same wyniki. Czy można to w ogóle osiągnąć python
?
83
Główny moduł Pythona, który jest uruchamiany, powinien import random
i powinien zostać wywołany random.seed(n)
- jest to współdzielone między wszystkimi innymi importami, o random
ile gdzieś indziej nie resetuje ziarna.
random
kodu poziomu modułu, który importujesz w main, zanim dojdziesz dorandom.seed(n)
in main, wtedy te wywołania zostaną wykonane przed ziarnem, a więc będą rozłożone w czasie i skutecznie niemożliwe do odtworzenia losowy.random.Random()
konstruktora i używać tych, gdy ważna jest ścisła odtwarzalność.Komentarz zss powinien być wyróżniony jako faktyczna odpowiedź:
źródło
random module
, powiedzmy, funkcji,random.choices()
a następnie w innym miejscu znumpy
generatora liczb losowych, powiedzmy,np.random.normal()
że musisz ustawić ziarno dla obu modułów. Co mogę zrobić, to zazwyczaj mają kilka linii w moimmain.py
Likerandom.seed(my_seed)
anp.random.seed(my_seed)
. Kudos to zssset_random_seed()
dla szałwii.Na początku swojej aplikacji zadzwoń,
random.seed(x)
upewniając się, że x jest zawsze takie samo. Zapewni to, że sekwencja liczb pseudolosowych będzie taka sama podczas każdego uruchomienia aplikacji.źródło
Jon Clements właściwie odpowiada na moje pytanie. Jednak to nie był prawdziwy problem: okazuje się, że przyczyną losowości mojego kodu był numpy.linalg SVD, ponieważ nie zawsze daje takie same wyniki dla źle uwarunkowanych macierzy !!
Więc pamiętaj, aby sprawdzić to w swoim kodzie, jeśli masz te same problemy!
źródło
Opierając się na poprzednich odpowiedziach: pamiętaj, że wiele konstrukcji może różnić się ścieżkami wykonania, nawet jeśli wszystkie nasiona są kontrolowane.
Pomyślałem " dobrze, ustawiłem swoje seedy, aby były zawsze takie same i nie mam żadnych zmieniających się / zewnętrznych zależności, dlatego ścieżka wykonania mojego kodu powinna być zawsze taka sama ”, ale to źle.
Przykładem, który mnie ugryzł, było to
list(set(...))
, że otrzymana kolejność może się różnić.źródło
Ważnym zastrzeżeniem jest to, że w wersjach Pythona starszych niż 3.7 klucze słownika nie są deterministyczne. Może to prowadzić do losowości w programie lub nawet do innej kolejności, w jakiej generowane są liczby losowe, a tym samym do niedeterministycznych liczb losowych. Wniosek aktualizacja Pythona.
źródło
Możesz to dość łatwo zagwarantować, używając własnego generatora liczb losowych.
Po prostu wybierz trzy duże liczby pierwsze (zakładając, że nie jest to aplikacja kryptograficzna) i podłącz je do a, b i c: a = ((a * b)% c) To daje system sprzężenia zwrotnego, który generuje całkiem przypadkowe dane. Zwróć uwagę, że nie wszystkie liczby pierwsze działają równie dobrze, ale jeśli wykonujesz tylko symulację, nie powinno to mieć znaczenia - wszystko, czego naprawdę potrzebujesz do większości symulacji, to mieszanina liczb ze wzorem (pseudolosowym, pamiętaj) na tyle złożonym, że w jakiś sposób nie pasuje do Twojej aplikacji.
Knuth o tym mówi.
źródło