2015-03-29 12 views
5

uruchomić następujący kod:NumPy random seed produkuje różne liczby losowe

np.random.RandomState(3) 
idx1 = np.random.choice(range(20),(5,)) 
idx2 = np.random.choice(range(20),(5,)) 
np.random.RandomState(3) 
idx1S = np.random.choice(range(20),(5,)) 
idx2S = np.random.choice(range(20),(5,))  

Wyjście mam jest następujący:

idx1: array([ 2, 19, 19, 9, 4]) 
idx1S: array([ 2, 19, 19, 9, 4]) 

idx2: array([ 9, 2, 7, 10, 6]) 
idx2S: array([ 5, 16, 9, 11, 15]) 

idx1 i mecz idx1S, ale idx2 i idx2S nie pasują . Spodziewam się, że raz posiewam generator liczb losowych i powtarzam tę samą sekwencję poleceń - powinien on wytwarzać tę samą sekwencję liczb losowych. Czy to nie prawda? Czy jest jeszcze coś, czego mi brakuje?

Odpowiedz

9

Dezorientujesz RandomState z seed. Twoja pierwsza linia tworzy obiekt, który możesz wykorzystać jako źródło losowe. Na przykład, robimy

>>> rnd = np.random.RandomState(3) 
>>> rnd 
<mtrand.RandomState object at 0xb17e18cc> 

a następnie

>>> rnd.choice(range(20), (5,)) 
array([10, 3, 8, 0, 19]) 
>>> rnd.choice(range(20), (5,)) 
array([10, 11, 9, 10, 6]) 
>>> rnd = np.random.RandomState(3) 
>>> rnd.choice(range(20), (5,)) 
array([10, 3, 8, 0, 19]) 
>>> rnd.choice(range(20), (5,)) 
array([10, 11, 9, 10, 6]) 

[I nie rozumiem, dlaczego twój idx1 i idx1S agree-- ale faktycznie nie zakładać izolujący zapis, więc podejrzany o błędzie użytkownik]

Jeśli chcesz mieć wpływ na globalnego stan, użyj seed.

>>> np.random.seed(3) 
>>> np.random.choice(range(20),(5,)) 
array([10, 3, 8, 0, 19]) 
>>> np.random.choice(range(20),(5,)) 
array([10, 11, 9, 10, 6]) 
>>> np.random.seed(3) 
>>> np.random.choice(range(20),(5,)) 
array([10, 3, 8, 0, 19]) 
>>> np.random.choice(range(20),(5,)) 
array([10, 11, 9, 10, 6]) 

Korzystanie z konkretnego obiektu RandomState może wydawać się mniej wygodne na początku, ale ułatwia to wiele różnych strumieni entropii, które można dostroić.

6

myślę, że należy użyć RandomState klasy następująco:

In [21]: r=np.random.RandomState(3) 

In [22]: r.choice(range(20),(5,)) 
Out[22]: array([10, 3, 8, 0, 19]) 

In [23]: r.choice(range(20),(5,)) 
Out[23]: array([10, 11, 9, 10, 6]) 

In [24]: r=np.random.RandomState(3) 

In [25]: r.choice(range(20),(5,)) 
Out[25]: array([10, 3, 8, 0, 19]) 

In [26]: r.choice(range(20),(5,)) 
Out[26]: array([10, 11, 9, 10, 6]) 

Basicly dokonać instancję r z RandomState i używać go dalej. Jak można zauważyć, ponowne sprowadzanie daje takie same wyniki.

Powiązane problemy