2015-08-23 26 views
23

Le seguenti importazioni NumPy e imposta il seme.Come posso recuperare il seme corrente del generatore di numeri casuali di NumPy?

import numpy as np 
np.random.seed(42) 

Tuttavia, non sono interessato a impostare il seme ma più a leggerlo. random.get_state() non sembra contenere il seme. Lo documentation non mostra una risposta ovvia.

Come si recupera il seme corrente utilizzato da numpy.random, supponendo che non l'abbia impostato manualmente?

Voglio utilizzare il seme corrente da riportare per la successiva iterazione di un processo.

+1

Puoi spiegare cosa intendi per * "utilizzare il seme corrente da trasferire per la successiva iterazione di un processo" *? C'è una ragione per cui non puoi semplicemente usare una combinazione di 'np.random.get_state' e' np.random.set_state', oppure passare un'istanza di 'np.random.RandomState' per tenere traccia degli interni stato del RNG? –

+0

@ali_m Se ho corretto il seme, so quale seme utilizzare per riprodurre il risultato. Tuttavia, se non ho riparato il seme, come posso vedere quale seme viene usato? – Mast

+1

perché la risposta alla tua domanda dice "La risposta breve è che semplicemente non puoi (almeno non nel caso generale)." Tuttavia hai accettato la risposta. È riuscito a rispondere alla tua domanda o no? Sono confuso. –

risposta

31

La risposta breve è che semplicemente non è possibile (almeno non in generale).

Il Mersenne Twister RNG utilizzato da NumPy ha 2 -1 possibili stati interni, mentre un singolo intero a 64 bit ha solo 2 valori possibili. È quindi impossibile mappare ogni stato RNG a un seme intero univoco.

È possibile ottenere e impostare lo stato interno del RNG utilizzando direttamente np.random.get_state e np.random.set_state. L'output di get_state è una tupla il cui secondo elemento è una matrice (624,) di numeri interi a 32 bit. Questo array ha più di bit sufficienti per rappresentare ogni possibile stato interno del RNG (2 624 * 32> 2 -1).

La tupla restituita da get_state può essere utilizzata in modo molto simile a un seme per creare sequenze riproducibili di numeri casuali. Per esempio:

import numpy as np 

# randomly initialize the RNG from some platform-dependent source of entropy 
np.random.seed(None) 

# get the initial state of the RNG 
st0 = np.random.get_state() 

# draw some random numbers 
print(np.random.randint(0, 100, 10)) 
# [ 8 76 76 33 77 26 3 1 68 21] 

# set the state back to what it was originally 
np.random.set_state(st0) 

# draw again 
print(np.random.randint(0, 100, 10)) 
# [ 8 76 76 33 77 26 3 1 68 21] 
+4

perché stai dicendo che non puoi "La risposta breve è che semplicemente non puoi (almeno non nel caso generale)." Mi sembra che tu possa da quello che ho letto sulla tua risposta. Non ho capito bene. –

+0

Capisco che la mappatura non funziona. Ma, se uso la tupla gigante restituita da Numpy, sto bene? Immagino che quando hai detto "non puoi" non sono realmente sicuro di quello che ti riferisci anche rispetto alla domanda originale e di come questa cosa della mappatura abbia qualcosa da fare, ha senso? –

+0

Non so se ovunque ci sia una definizione rigorosa di quali semi devono essere in ogni contesto. Se la tupla o qualsiasi altra struttura ti riporta allo stesso stato di casualità desiderato, non è questo un seme? Non sapevo che i semi ** dovessero essere un numero intero. Ma la tua risposta sembra funzionare, o c'è un avvertimento tranne la rappresentazione intera che hai menzionato? –

1

Controllare il primo elemento della matrice restituita da np.random.get_state(), sembra esattamente il seme casuale per me.

+0

Sì, anche se non è esplicito, è probabilmente il modo in cui la risposta già fornita riesce a funzionare come fa. – Mast