2011-12-07 13 views
6

Duplicar posibles:
Python's random: What happens if I don't use seed(someValue)?Semillas() y números aleatorios en Python

Hoy, me dijeron que sólo acerca de la función seed() de un programador con mucha más experiencia que yo. Normalmente solo llamo al choice() con una lista como argumento, ya que no necesito más funcionalidad de números aleatorios que eso.

Mi amigo programador me dijo que llamar a la semilla es necesario porque de lo contrario Python siempre comienza operaciones de números aleatorios con cero como la inicialización predeterminada. Esto significa que, aunque los números parecen aleatorios, en realidad estamos obteniendo la misma secuencia cada vez.

Esto me parece bastante extraño. ¿La función choice(), por ejemplo, realmente no llama a semilla antes de que haga su trabajo? ¿O es la razón por la cual no puede cambiar su semilla de forma programática porque eso en sí mismo implicaría elegir un número aleatorio, y obviamente que es un problema si nuestro objetivo final es también elegir un número aleatorio!

Estoy despotricando un poco aquí, pero me pregunto si alguien tiene una idea clara de cómo se implementó todo esto.

+2

Estas son todas las cosas que puede aprender en la documentación (http://docs.python.org/library/random.html), o probándolas usted mismo en el intérprete. Intenta ejecutar Python y haz 'random.choice (range (1000))' dos veces. ¿Recibes la misma respuesta? –

+0

@MichaelHoffman te has perdido el punto. Por supuesto, no obtendrás la misma respuesta al hacerlo dos veces en el mismo proceso de Python. La prueba correcta es abrir dos procesos y probarlo en cada uno. –

+0

Lo escribí mal. Quise decir que toda la operación (ejecutar Python y realizar la función) debería hacerse dos veces. –

Respuesta

28

Su amigo está muerto mal, y sabría lo que si leyó la documentación de la función seed():

inicializar el generador de números aleatorios básica. El argumento opcional x puede ser cualquier objeto hashable. Si se omite x o None, se usa la hora actual del sistema; la hora del sistema actual también se usa para inicializar el generador cuando se importa por primera vez. Si el sistema operativo proporciona fuentes de aleatoriedad, se utilizan en lugar de la hora del sistema (consulte la función os.urandom() para obtener detalles sobre la disponibilidad).

(El subrayado es mío.)

Ha adivinar basa en su conocimiento de cómo funciona en otros idiomas. La función seed() se proporciona principalmente para que pueda obtener un flujo reproducible de números pseudoaleatorios (que es necesario para algunas aplicaciones específicas).

Las funciones que llama directamente desde el módulo random son en realidad alias a los métodos de una instancia oculta de la clase random.Random. Cada instancia, al menos en efecto, llama al seed() dentro de su __init__().

La función choice() obviamente no llama a seed() antes de la operación, porque eso significaría volver a sembrar antes de cada elección, lo que frustra el propósito de la siembra.

+0

Gracias por su respuesta. –