2012-08-13 12 views
18

Sto cercando di riprodurre una sequenza casuale da Python random.random() su un sistema diverso con una versione diversa di python3 installata.Perché il seeding del generatore casuale non è stabile tra le versioni di Python?

Questo dovrebbe essere facile come il documentation says:

La maggior parte degli algoritmi del modulo casuale e le funzioni di semina sono soggette a modifiche attraverso versioni di Python, ma due aspetti sono garantiti non cambiare:

  • Se viene aggiunto un nuovo metodo di semina, verrà offerta una seminatrice compatibile con le versioni precedenti .
  • Il metodo random() del generatore continuerà a produce la stessa sequenza quando la seminatrice compatibile riceve lo stesso seme .

quindi mi aspetto il seguente codice per stampare sempre gli stessi 10 numeri, non importa la specifica versione python3:

import sys 
print(sys.version) 

from random import seed, random 

seed(str(1)) 
for i in range(10): 
    print(random()) 

Tuttavia, test su due macchine diverse:

3.2.3 (default, May 3 2012, 15:51:42) 
[GCC 4.6.3] 
0.4782479962566343 
0.044242767098090496 
0.11703586901195051 
0.8566892547933538 
0.2926790185279551 
0.0067328440779825804 
0.0013279506360178717 
0.22167546902173108 
0.9864945747444945 
0.5157002525757287 

e

3.1.2 (release31-maint, Dec 9 2011, 20:59:40) 
[GCC 4.4.5] 
0.0698436845523 
0.27772471476 
0.833036057868 
0.35569897036 
0.36366158783 
0.722487971761 
0.963133581734 
0.263723867191 
0.451002768569 
0.0998765577881 

Dai diversi risultati.

Perché è questo? E c'è un modo per fare questo lavoro

+1

per quello che vale, in esecuzione lo snippet di codice in 2.7 produce una serie completamente diversa di numeri di uno dei due che hai postato. –

+3

Si afferma * verrà offerta una seminatrice compatibile con le versioni precedenti * non che il metodo esistente sia compatibile con le versioni precedenti. – borrible

risposta

15

stavo guardando attraverso What's New in Python 3.2 (a causa di questo problema), e ho trovato (cioè ottenere la stessa sequenza casuale due volte?):

Il random.seed() funzione e metodo ora semi stringa salina con funzione di hash sha512. Per accedere alla versione precedente di seed al fine di riprodurre sequenze di Python 3.1, impostare l'argomento version su 1, random.seed (s, version = 1).

Sembra essere un cambio di interruzione (da 3.1 a 3.2) con un'opzione di compatibilità all'indietro.

(Come borrible sottolineato, perché una seminatrice compatibile è offerto il contratto documentazione non è stata violata.)

+0

Grazie, questo deve essere il problema. Devo dire che non è molto conveniente che l'argomento della versione non fosse ancora presente in 3.1 :( –

+1

Che si applica quando si usano string semi. A differenza dell'OP, sto seminando il mio generatore di numeri casuali con int e vedendo risultati diversi. Per inciso, il metodo getstate() restituisce lo stesso stato interno, quindi non è il bit di seeding che è cambiato, è la generazione di numeri casuali effettiva. –

+3

Oh, in realtà vedo random.random() produrre la stessa sequenza - è random.shuffle () e random.randrange() che producono risultati diversi su Python 3.1 e 3.2, anche se hanno lo stesso seme. :-( –

4

la documentazione per seed dicono di usare la funzione di hash per convertire le stringhe di semi di input validi. Quando ho provato varie versioni di Python2.X (non ho 3 installato al momento), alcune versioni davano valori diversi per hash(str(1)) Si noti che i documenti per seme dicono che, indipendentemente dalla versione, usano il valore hash per la stringa. Potresti voler passare invece un int (oltre al punto di @pst sull'utilizzo della versione di seed compatibile all'indietro).

Snippet da random module docs per 3.2:

Se x è un int, viene utilizzato direttamente.

Con la versione 2 (impostazione predefinita), un oggetto str, bytes o bytearray ottiene convertito in un intero e tutti i relativi bit vengono utilizzati. Con la versione 1, invece, viene utilizzato l'hash() x.

(x Ecco l'inizializzazione per le sementi)

Problemi correlati