2012-06-17 7 views
12

En Python, ¿cuál es la mejor manera de generar un número aleatorio utilizando una determinada semilla pero sin resembrar el estado global? En Java, se podría escribir simplemente:Establecer semilla aleatoria temporalmente, como "new Random()"

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

y el estándar Math.random() no se vería afectada. En Python, la mejor solución que puedo ver es:

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

¿Es esta idiomática Python? Parece mucho menos limpio que la solución Java que no requiere "restaurar" una semilla anterior. Me encantaría saber si hay una mejor manera de hacer esto.

Respuesta

22

Puede instanciar su propio objeto Random.

myrandom = random.Random(myseed) 

El módulo random gestiona su propia instancia de Random, que no se verán afectados por los cambios realizados a myrandom.

+0

Vaya, de algún modo me olvidé de este comentario en [documentos aleatorios] (http://docs.python.org/library/random.html): "Puede instanciar sus propias instancias de Aleatorio para obtener generadores que no lo hacen compartir estado ". ¡Gracias! –

+2

@BenAlpert, sí, también lo hice cuando fui a verificarlos dos veces. Pero sabía que había visto 'Random' en' dir (random) 'antes, y estaba allí en la fuente cuando miré. No estoy seguro de por qué la clase 'Random' en sí no tiene su propia lista en los documentos. – senderle

+0

Siempre me sorprende cuando alguien recibe muchos votos solo por señalar lo que hay en la documentación ... incluido [yo mismo] (http://stackoverflow.com/a/3909907/355230). Lo mismo para las preguntas que podrían haber sido respondidas al leerlo ... – martineau

Cuestiones relacionadas