Dokonałeś już wielu poprawnych obserwacji!
O ile nie chcesz wysiewać obu losowych generatorów, na dłuższą metę prawdopodobnie łatwiej będzie wybrać jeden lub drugi generator. Ale jeśli musisz użyć obu, to tak, musisz również zasiać oba, ponieważ generują liczby losowe niezależnie od siebie.
Ponieważ numpy.random.seed()
główna trudność polega na tym, że nie jest bezpieczny dla wątków - to znaczy, że nie jest bezpieczny w użyciu, jeśli masz wiele różnych wątków wykonania , ponieważ nie ma gwarancji, że zadziała, jeśli dwa różne wątki wykonują funkcję w tym samym czasie. Jeśli nie używasz wątków i możesz rozsądnie oczekiwać, że nie będziesz musiał przepisywać swojego programu w ten sposób w przyszłości, numpy.random.seed()
powinno być dobrze. Jeśli istnieje jakikolwiek powód, by podejrzewać, że możesz potrzebować wątków w przyszłości, na dłuższą metę znacznie bezpieczniej jest postępować zgodnie z sugestią i utworzyć lokalną instancję numpy.random.Random
klasy . O ile wiem, random.random.seed()
jest bezpieczny dla wątków (a przynajmniej nie znalazłem żadnych dowodów przeciwnych).
numpy.random
Biblioteka zawiera kilka dodatkowych rozkładów prawdopodobieństwa powszechnie wykorzystywane w badaniach naukowych, a także kilka funkcji wygoda dla generowania tablic losowych danych. random.random
Biblioteka jest trochę bardziej lekki i powinno być w porządku, jeśli nie robisz badań naukowych lub innych rodzajów prac w statystykach.
W przeciwnym razie obaj używają sekwencji twistera Mersenne'a do generowania swoich liczb losowych i oba są całkowicie deterministyczne - to znaczy, jeśli znasz kilka kluczowych informacji, można z absolutną pewnością przewidzieć, jaka liczba będzie następna . Z tego powodu ani numpy.random, ani random.random nie nadają się do poważnych zastosowań kryptograficznych . Ale ponieważ sekwencja jest tak bardzo długa, obie są dobre do generowania liczb losowych w przypadkach, gdy nie martwisz się, że ludzie próbują odtworzyć twoje dane. Stąd też konieczność zasiania losowej wartości - jeśli zaczniesz za każdym razem w tym samym miejscu, zawsze otrzymasz tę samą sekwencję liczb losowych!
Na marginesie, jeśli nie potrzebujemy poziom losowości kryptograficznych, należy użyć tajemnice moduł lub coś podobnego Crypto.Random jeśli używasz wersji Pythona wcześniej niż Python 3.6.
random.random
samodzielnie. Jednak zwykle tego nie potrzebujesz.Począwszy od Pythona do analizy danych , moduł
numpy.random
uzupełnia Pythonrandom
o funkcje do wydajnego generowania całych tablic wartości przykładowych z wielu rodzajów rozkładów prawdopodobieństwa.Z kolei wbudowany
random
moduł Pythona próbkuje tylko jedną wartość na raz, podczas gdynumpy.random
może szybciej generować bardzo duże próbki. Korzystając z magicznej funkcji IPythona,%timeit
można zobaczyć, który moduł działa szybciej:źródło
np.random.randint(2)
zrandom.randrange(2)
NumPy był wolniejszy . NumPy: 1,25 nas i losowo: 891 ns. A także ta sama relacja dlanp.random.rand()
irandom.random()
.Źródło ziarna i używany profil dystrybucji będą miały wpływ na wyniki - jeśli szukasz kryptograficznej losowości, seeding z os.urandom () otrzyma prawie rzeczywiste losowe bajty z rozmowy urządzenia (tj. Ethernet lub dysk) (tj. / dev / random na BSD)
pozwoli to uniknąć podania ziarna, a tym samym generowania deterministycznych liczb losowych. Jednak losowe wywołania pozwalają następnie dopasować liczby do rozkładu (to, co nazywam naukową losowością - ostatecznie wszystko, czego chcesz, to rozkład krzywej dzwonowej liczb losowych, numpy jest najlepszy w osiągnięciu tego.
WIĘC tak, trzymaj się jednego generatora, ale zdecyduj, jaki chcesz losowy - losowy, ale zdecydowanie na podstawie krzywej zniekształcenia lub tak losowy, jak możesz uzyskać bez urządzenia kwantowego.
źródło