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
?
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
?
Odpowiedzi:
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 do random.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ź:
Kolejna rzecz, na którą ludzie powinni uważać: jeśli używasz
numpy.random
, musisz użyć,numpy.random.seed()
aby ustawić ziarno. Użycierandom.seed()
nie ustawi ziarna dla liczb losowych wygenerowanych znumpy.random
. To mnie przez chwilę zdezorientowało. -zss
random module
, powiedzmy, funkcji, random.choices()
a następnie w innym miejscu z numpy
generatora liczb losowych, powiedzmy, np.random.normal()
że musisz ustawić ziarno dla obu modułów. Co mogę zrobić, to zazwyczaj mają kilka linii w moim main.py
Like random.seed(my_seed)
a np.random.seed(my_seed)
. Kudos to zss
set_random_seed()
dla szałwii.
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!
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ć.
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.
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.