2012-09-16 10 views
7

È garantito che lo script pyhon2/python3 con generatore casuale inizializzato con random.setstate() o random.seed() produrrà la stessa sequenza di pseudo-casualità tra diverse versioni e piattaforme? (ad esempio python 3.1 on Mac , the same as python 3.2 on Linux 64-bit)python random.setstate(), seed() - esiste garanzia degli stessi risultati nelle implementazioni?

La domanda riguarda entrambi: python2 e python3, con l'ipotesi che gli script python3 vengano eseguiti su interpreti python3 e viceversa.

+0

http://docs.python.org/dev/ library/random.html # random.seed –

+0

non dice se python3.x e python3.y dove x! = y produrrà gli stessi risultati –

+1

Se la documentazione non afferma che i risultati sono garantiti per essere uguali nelle versioni python quindi non fa parte dell'API e non è corretto dipendere da esso. O, almeno, questo è quello che penso. Anche se il fatto che l'algoritmo sia menzionato può portare a porre la tua domanda. – Bakuriu

risposta

6

Python 2.3 e versioni successive utilizzano il generatore Mersenne Twister, che è indipendente dalla funzione casuale del sistema (implementata come modulo di estensione C per Python). Per qualsiasi versione che utilizza Mersenne Twister, i risultati dovrebbero essere gli stessi su tutte le versioni e piattaforme.

In precedenza, è possibile garantire la compatibilità con le versioni precedenti utilizzando il generatore WichmannHill, ma sfortunatamente sembra che sia stato rimosso in Python 3.x.

Se è assolutamente necessario garantire la compatibilità, scrivere il proprio Random sottoclasse (o usare un'implementazione esterna stabile, ad esempio simplerandom) come raccomandato dalla documentazione random:

classe a caso può essere sottoclasse se si vuole utilizzare un generatore di base diverso per la propria idea: in tal caso, sovrascrivere i metodi random(), seed(), getstate(), setstate() e jumpahead(). Facoltativamente, un nuovo generatore può fornire un metodo getrandbits(): ciò consente a randrange() di produrre selezioni su un intervallo arbitrariamente ampio.

4

È possibile utilizzare il modulo simplerandom, che ha un'implementazione coerente indipendente dalla piattaforma Python. Ha supporto per Python 2.4, 2.5, 2.6, 2.7, 3.1 e 3.2. Ha 9 diversi algoritmi.

Ecco un esempio:

>>> import simplerandom.iterators as sri 
>>> rng = sri.MWC1(12345) 
>>> next(rng) 
498186671L 
>>> next(rng) 
888940288L 
>>> next(rng) 
345072384L 

E finché si seeding con lo stesso valore, si ottiene lo stesso risultato:

>>> rng = sri.MWC1(12345) 
>>> next(rng) 
498186671L 
>>> rng = sri.MWC1(98765) 
>>> next(rng) 
3546724783L 
Problemi correlati