2012-06-17 12 views
12

In Python, qual è il modo migliore per generare un numero casuale usando un certo seme ma senza resociare lo stato globale? In Java, si potrebbe scrivere semplicemente:Imposta temporaneamente seme casuale, come "nuovo casuale()"

Random r = new Random(seed); 
r.nextDouble(); 

e lo standard Math.random() non ne risentirebbe. In Python, la soluzione migliore che riesco a vedere è:

old_state = random.getstate() 
random.seed(seed) 
random.random() 
random.setstate(old_state) 

È questo Python idiomatico? Sembra molto meno pulito della soluzione Java che non richiede il "ripristino" di un vecchio seme. Mi piacerebbe sapere se c'è un modo migliore per farlo.

risposta

22

È possibile creare un'istanza per il proprio oggetto Random.

myrandom = random.Random(myseed) 

Il modulo random gestisce la propria istanza di Random, che sia esente dagli modifiche apportate myrandom.

+0

Oops, in qualche modo ho perso questo commento sui [documenti casuali] (http://docs.python.org/library/random.html): "Puoi istanziare le tue istanze di Random per ottenere generatori che non condividere stato. " Grazie! –

+2

@ BenAlpert, sì, l'ho fatto anche io quando sono andato a ricontrollarli. Ma sapevo di aver visto 'Random' in' dir (random) 'prima, ed era lì nella fonte quando ho guardato. Non sono sicuro del motivo per cui la classe 'Random' stessa non ha il proprio elenco nei documenti. – senderle

+0

È sempre fantastico per me quando qualcuno ottiene molti voti positivi solo per indicare cosa c'è nella documentazione ... incluso [me] (http://stackoverflow.com/a/3909907/355230). Lo stesso per le domande a cui avrebbe potuto rispondere leggendo ... – martineau