random.seed (): ¿Qué hace?


177

Estoy un poco confundido sobre lo que random.seed()hace en Python. Por ejemplo, ¿por qué los siguientes ensayos hacen lo que hacen (consistentemente)?

>>> import random
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.randint(1, 10)
3
>>> random.randint(1, 10)
6
>>> random.randint(1, 10)
6
>>> random.randint(1, 10)
7

No pude encontrar buena documentación sobre esto.


30
La generación de números aleatorios no es realmente "aleatoria". Es determinista, y la secuencia que genera está dictada por el valor inicial que ingresa random.seed. Por lo general, solo invoca random.seed(), y utiliza la hora actual como valor inicial, lo que significa que cada vez que ejecute el script obtendrá una secuencia de valores diferente.
Asad Saeeduddin

3
Pasar la misma semilla al azar y luego llamarla te dará el mismo conjunto de números. Esto funciona según lo previsto, y si desea que los resultados sean diferentes cada vez que tenga que sembrarlo con algo diferente cada vez que inicie una aplicación (por ejemplo, salida de / dev / random o time)
Tymoteusz Paul

55
La semilla es lo que se alimenta al RNG para generar el primer número aleatorio. Después de eso, RNG se autoalimenta. No ves la misma respuesta constantemente debido a esto. Si ejecuta este script nuevamente, obtendrá la misma secuencia de números "aleatorios". Establecer la semilla es útil si desea reproducir resultados, ya que todos los números "aleatorios" generados siempre serán los mismos.
Parpadeo

Vale la pena mencionar: la secuencia que se muestra en esta publicación está en Python 2. Python 3 ofrece una secuencia diferente.
ggorlen

1
El uso de @Blink de "número aleatorio" es engañoso. El RNG tiene un estado interno que se autoalimenta. De este estado interno, se deriva la salida para randint (1,10) y otras llamadas. Si el RNG se alimentaba de la salida de randint (1,10), la secuencia colapsaría a 1 de como máximo 10 secuencias y la secuencia se repetiría después de como máximo 10 números.
Joachim Wagner

Respuestas:


213

Los generadores de números pseudoaleatorios funcionan realizando alguna operación en un valor. Generalmente este valor es el número anterior generado por el generador. Sin embargo, la primera vez que usa el generador, no hay ningún valor anterior.

Sembrar un generador de números pseudoaleatorios le da su primer valor "anterior". Cada valor inicial corresponderá a una secuencia de valores generados para un generador de números aleatorios dado. Es decir, si proporciona la misma semilla dos veces, obtendrá la misma secuencia de números dos veces.

En general, desea sembrar su generador de números aleatorios con algún valor que cambie cada ejecución del programa. Por ejemplo, la hora actual es una semilla de uso frecuente. La razón por la cual esto no sucede automáticamente es para que, si lo desea, pueda proporcionar una semilla específica para obtener una secuencia de números conocida.


39
Cabe mencionar que a veces queremos dar semilla para que se genere la misma secuencia aleatoria en cada ejecución del programa. A veces, se evita la aleatoriedad en los programas de software para mantener el comportamiento del programa determinista y la posibilidad de reproducir los problemas / errores.
ViFI

1
Siguiendo lo que dijo @ViFI, mantener un comportamiento determinista del programa (con una semilla fija o una secuencia fija de semillas) también puede permitirle evaluar mejor si algún cambio en su programa es beneficioso o no.
shaneb

¿te importaría explicar con un escenario de la vida real? No puedo entender un caso de uso para el mismo. ¿Tenemos algo similar a esto en otro lenguaje de programación también?
Shashank Vivek

1
Aquí hay un escenario de la vida real: stackoverflow.com/questions/5836335/… . Las semillas aleatorias también son comunes para crear resultados reproducibles para la investigación. Por ejemplo, si es un científico de datos y desea publicar sus resultados con algún tipo de modelo que use la aleatoriedad (por ejemplo, un bosque aleatorio), querrá incluir una semilla en su código publicado para que las personas puedan asegurarse de que su Los cálculos son reproducibles.
Galen Long

89

Todas las otras respuestas no parecen explicar el uso de random.seed (). Aquí hay un ejemplo simple ( fuente ):

import random
random.seed( 3 )
print "Random number with seed 3 : ", random.random() #will generate a random number 
#if you want to use the same random number once again in your program
random.seed( 3 )
random.random()   # same random number as before

33
>>> random.seed(9001)   
>>> random.randint(1, 10)  
1     
>>> random.seed(9001)     
>>> random.randint(1, 10)    
1           
>>> random.seed(9001)          
>>> random.randint(1, 10)                 
1                  
>>> random.seed(9001)         
>>> random.randint(1, 10)          
1     
>>> random.seed(9002)                
>>> random.randint(1, 10)             
3

Intenta esto.

Digamos que 'random.seed' le da un valor al generador de valores aleatorios ('random.randint ()') que genera estos valores sobre la base de esta semilla. Una de las propiedades imprescindibles de los números aleatorios es que deben ser reproducibles. Cuando pones la misma semilla, obtienes el mismo patrón de números aleatorios. De esta manera, los está generando desde el principio. Usted da una semilla diferente, comienza con una inicial diferente (arriba de 3).

Dada una semilla, generará números aleatorios entre 1 y 10 uno tras otro. Entonces asumes un conjunto de números para un valor semilla.


15

Un número aleatorio es generado por alguna operación en el valor anterior.

Si no hay un valor anterior, entonces la hora actual como valor anterior automáticamente. Podemos proporcionar este valor anterior por cuenta propia usando random.seed(x)donde xpodría haber cualquier número o cadena, etc.

Por random.random()lo tanto, no es un número aleatorio perfecto, se podría predecir a través de random.seed(x).

import random 
random.seed(45)            #seed=45  
random.random()            #1st rand value=0.2718754143840908
0.2718754143840908  
random.random()            #2nd rand value=0.48802820785090784
0.48802820785090784  
random.seed(45)            # again reasign seed=45  
random.random()
0.2718754143840908         #matching with 1st rand value  
random.random()
0.48802820785090784        #matching with 2nd rand value

Por lo tanto, generar un número aleatorio no es realmente aleatorio, porque se ejecuta en algoritmos. Los algoritmos siempre dan la misma salida basada en la misma entrada. Esto significa que depende del valor de la semilla. Entonces, para hacerlo más aleatorio, el tiempo se asigna automáticamente seed().


11
Seed() can be used for later use ---

Example:
>>> import numpy as np
>>> np.random.seed(12)
>>> np.random.rand(4)
array([0.15416284, 0.7400497 , 0.26331502, 0.53373939])
>>>
>>>
>>> np.random.seed(10)
>>> np.random.rand(4)
array([0.77132064, 0.02075195, 0.63364823, 0.74880388])
>>>
>>>
>>> np.random.seed(12) # When you use same seed as before you will get same random output as before
>>> np.random.rand(4)
array([0.15416284, 0.7400497 , 0.26331502, 0.53373939])
>>>
>>>
>>> np.random.seed(10)
>>> np.random.rand(4)
array([0.77132064, 0.02075195, 0.63364823, 0.74880388])
>>>

11
# Simple Python program to understand random.seed() importance

import random

random.seed(10)

for i in range(5):    
    print(random.randint(1, 100))

Ejecute el programa anterior varias veces ...

Primer intento: imprime 5 enteros aleatorios en el rango de 1 a 100

Segundo intento: imprime los mismos 5 números aleatorios que aparecieron en la ejecución anterior.

3er intento: igual

.....Pronto

Explicación: Cada vez que ejecutamos el programa anterior, establecemos la semilla en 10, luego el generador aleatorio toma esto como una variable de referencia. Y luego, al hacer una fórmula predefinida, genera un número aleatorio.

Por lo tanto, establecer semilla en 10 en la próxima ejecución nuevamente establece el número de referencia en 10 y nuevamente comienza el mismo comportamiento ...

Tan pronto como restablecemos el valor de la semilla, da las mismas plantas.

Nota: Cambie el valor inicial y ejecute el programa, verá una secuencia aleatoria diferente a la anterior.


7

En este caso, random es en realidad seudoaleatorio. Dada una semilla, generará números con una distribución igual. Pero con la misma semilla, generará la misma secuencia de números cada vez. Si quieres que cambie, tendrás que cambiar tu semilla. A mucha gente le gusta generar una semilla basada en la hora actual o algo así.


6

En mi humilde opinión, se usa para generar el mismo resultado de curso aleatorio cuando se usa random.seed(samedigit)nuevamente.

In [47]: random.randint(7,10)

Out[47]: 9


In [48]: random.randint(7,10)

Out[48]: 9


In [49]: random.randint(7,10)

Out[49]: 7


In [50]: random.randint(7,10)

Out[50]: 10


In [51]: random.seed(5)


In [52]: random.randint(7,10)

Out[52]: 9


In [53]: random.seed(5)


In [54]: random.randint(7,10)

Out[54]: 9

4

Establezca seed(x)antes de generar un conjunto de números aleatorios y use la misma semilla para generar el mismo conjunto de números aleatorios. Útil en caso de reproducir los temas.

>>> from random import *
>>> seed(20)
>>> randint(1,100)
93
>>> randint(1,100)
88
>>> randint(1,100)
99
>>> seed(20)
>>> randint(1,100)
93
>>> randint(1,100)
88
>>> randint(1,100)
99
>>> 

3

Aquí está mi entendimiento. Cada vez que establecemos un valor semilla, se genera una "etiqueta" o "referencia". La siguiente llamada random.function se adjunta a esta "etiqueta", por lo que la próxima vez que llame al mismo valor de inicialización y random.function, obtendrá el mismo resultado.

np.random.seed( 3 )
print(np.random.randn()) # output: 1.7886284734303186

np.random.seed( 3 )
print(np.random.rand()) # different function. output: 0.5507979025745755

np.random.seed( 5 )
print(np.random.rand()) # different seed value. output: 0.22199317108973948

1

Aquí hay una pequeña prueba que demuestra que alimentar el seed()método con el mismo argumento causará el mismo resultado pseudoaleatorio:

# testing random.seed()

import random

def equalityCheck(l):
    state=None
    x=l[0]
    for i in l:
        if i!=x:
            state=False
            break
        else:
            state=True
    return state


l=[]

for i in range(1000):
    random.seed(10)
    l.append(random.random())

print "All elements in l are equal?",equalityCheck(l)

44
Control de igualdad más corto:len(set(l))<=1
Oliver Ni

0

random.seed(a, version)en python se usa para inicializar el generador de números pseudoaleatorios (PRNG) .

PRNG es un algoritmo que genera una secuencia de números que se aproxima a las propiedades de los números aleatorios. Estos números aleatorios se pueden reproducir utilizando el valor de semilla . Entonces, si proporciona un valor de inicialización, PRNG comienza desde un estado inicial arbitrario utilizando una inicialización.

El argumento a es el valor semilla. Si el valor a es None, por defecto, se usa la hora actual del sistema.

y versiones un entero que especifica cómo convertir un parámetro en un entero. El valor predeterminado es 2.

import random
random.seed(9001)
random.randint(1, 10) #this gives output of 1
# 1

Si desea que se reproduzca el mismo número aleatorio, proporcione nuevamente la misma semilla

random.seed(9001)
random.randint(1, 10) # this will give the same output of 1
# 1

Si no proporciona la semilla, genera un número diferente y no 1 como antes

random.randint(1, 10) # this gives 7 without providing seed
# 7

Si proporciona una semilla diferente a la anterior , le dará un número aleatorio diferente

random.seed(9002)
random.randint(1, 10) # this gives you 5 not 1
# 5

Entonces, en resumen, si desea que se reproduzca el mismo número aleatorio, proporcione la semilla. Específicamente, la misma semilla .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.