2015-03-29 17 views
5

ho eseguire il codice seguente:NumPy seme casuale produce diversi numeri casuali

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,))  

L'uscita ottengo è il seguente:

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 and match idx1S, ma idx2 e idx2S non corrispondono . Mi aspetto che una volta che ho seminato il generatore di numeri casuali e ripetuto la stessa sequenza di comandi - dovrebbe produrre la stessa sequenza di numeri casuali. Non è vero? O c'è qualcos'altro che mi manca?

risposta

9

Stai confondendo RandomState con seed. La tua prima linea costruisce un oggetto che puoi usare come fonte casuale. Ad esempio, facciamo

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

e poi

>>> 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]) 

[Non capisco il motivo per cui il tuo idx1 e idx1S agree--, ma non hai fatto pubblicare una trascrizione self-contained, così ho errore di sospetto utente]

Se si vuole influenzare la stato globale , utilizzare 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]) 

L'utilizzo di uno specifico oggetto RandomState all'inizio può sembrare meno conveniente, ma rende molte cose più semplici quando si desiderano flussi di entropia diversi che è possibile regolare.

6

Credo che si dovrebbe utilizzare la classe RandomState come segue:

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]) 

Fondamentalmente, si effettua un'istanza r del RandomState e usarlo ulteriormente. Come si può vedere, ri-schierarsi produce gli stessi risultati.