2012-01-25 22 views
9

Estoy acostumbrado a escribir random.randrange. Voy a hacer un from random import Random para detectar el error a partir de ahora.¿Cómo funciona python's random.Random.seed?

Para un juego que implica la generación de procedimiento (No, no es un clon de Minecraft: p) Me gustaría mantener varios generadores de números pseudo-aleatorios distintos:

  • uno para la generación del mundo (paisaje, misiones, etc.),
  • uno para los eventos aleatorios que pueden suceder en el mundo (como daños durante la lucha).

La razón es que quiero poder reproducir la primera, por lo que no quiero que la segunda interfiera.

Pensé que random.Random estaba hecho para eso. Sin embargo, algo me desconcierta:

import random 
rnd = random.Random() 
rnd.seed(0) 
print [random.randrange(5) for i in range(10)] 
rnd.seed(0) 
print [random.randrange(5) for i in range(10)] 

produce dos secuencias diferentes. Cuando hago rnd = random, entonces las cosas funcionan como se esperaba, pero sí necesito varios generadores.

¿Qué me estoy perdiendo?

+1

En realidad, me llevó unos minutos detectarlo también. No te sientas mal por todos nosotros, me alegro de que esté resuelto :) –

Respuesta

13

Funciona casi exactamente como se ha intentado pero el rnd.seed() está relacionada con el rnd objeto

sólo tiene que utilizar

rnd = random.Random(0) # <<-- or set it here 
rnd.seed(7) 
print [rnd.randrange(5) for i in range(10)] 

o mediante el establecimiento de la semilla mundial, así:

random.seed(7) 
print [random.randrange(5) for i in range(10)] 
4

Pasar la semilla para el constructor de Random:

>>> import random 
>>> rnd = random.Random(0) 
>>> [rnd.randint(0, 10) for i in range(10)] 
[9, 8, 4, 2, 5, 4, 8, 3, 5, 6] 
>>> rnd = random.Random(0) 
>>> [rnd.randint(0, 10) for i in range(10)] 
[9, 8, 4, 2, 5, 4, 8, 3, 5, 6] 
>>> rnd = random.Random(1) 
>>> [rnd.randint(0, 10) for i in range(10)] 
[1, 9, 8, 2, 5, 4, 7, 8, 1, 0]