random.seed (): O que faz?


177

Estou um pouco confuso sobre o que random.seed()faz em Python. Por exemplo, por que os ensaios abaixo fazem o que fazem (de forma consistente)?

>>> 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

Não consegui encontrar boa documentação sobre isso.


30
A geração aleatória de números não é verdadeiramente "aleatória". É determinístico, e a sequência que gera é ditada pelo valor inicial que você passa random.seed. Normalmente, você invoca random.seed()e usa o tempo atual como valor inicial, o que significa que sempre que você executa o script, obtém uma sequência diferente de valores.
Asad Saeeduddin 25/03

3
Passar a mesma semente aleatoriamente e depois chamá-la fornecerá o mesmo conjunto de números. Isso está funcionando conforme o planejado, e se você deseja que os resultados sejam diferentes toda vez que precisar de algo diferente toda vez que iniciar um aplicativo (por exemplo, saída de / dev / random ou time)
Tymoteusz Paul

5
A semente é o que é fornecido ao RNG para gerar o primeiro número aleatório. Depois disso, eles RNG é auto-alimentado. Você não vê a mesma resposta de forma consistente por causa disso. Se você executar esse script novamente, obterá a mesma sequência de números "aleatórios". Definir a semente é útil se você deseja reproduzir resultados, pois todos os números "aleatórios" gerados sempre serão os mesmos.
Blink

Vale ressaltar: a sequência mostrada neste post está no Python 2. O Python 3 fornece uma sequência diferente.
Ggorlen # 30/19

1
O uso do "número aleatório" pelo @Blink é enganador. O RNG tem um estado interno que é alimentado automaticamente. Desse estado interno, a saída para randint (1,10) e outras chamadas são derivadas. Se o RNG estivesse alimentando a partir da saída de randint (1,10), a sequência entraria em colapso para 1 de no máximo 10 sequências e a sequência seria repetida após no máximo 10 números.
Joachim Wagner

Respostas:


213

Geradores de números pseudo-aleatórios funcionam executando alguma operação em um valor. Geralmente esse valor é o número anterior gerado pelo gerador. No entanto, na primeira vez em que você usa o gerador, não há valor anterior.

A semeadura de um gerador de números pseudo-aleatórios fornece seu primeiro valor "anterior". Cada valor inicial corresponde a uma sequência de valores gerados para um determinado gerador de números aleatórios. Ou seja, se você fornecer a mesma semente duas vezes, obterá a mesma sequência de números duas vezes.

Geralmente, você deseja propagar seu gerador de números aleatórios com algum valor que alterará cada execução do programa. Por exemplo, o horário atual é uma semente usada com frequência. A razão pela qual isso não ocorre automaticamente é para que, se você quiser, forneça uma semente específica para obter uma sequência conhecida de números.


39
Vale a pena mencionar que, às vezes, queremos fornecer sementes para que a mesma sequência aleatória seja gerada em cada execução do programa. Às vezes, a aleatoriedade no (s) programa (s) de software é evitada para manter o comportamento do programa determinista e a possibilidade de reproduzir os problemas / bugs.
ViFI

1
Seguindo o que o @ViFI disse, manter o comportamento do programa determinístico (com uma semente fixa ou sequência fixa de sementes) também pode permitir que você avalie melhor se alguma mudança no seu programa é benéfica ou não.
Shaneb

você se importaria de explicar com algum cenário da vida real. Não consigo entender um caso de uso para o mesmo. Também temos algo parecido com isso em outra linguagem de programação?
Shashank Vivek

1
Aqui está um cenário da vida real: stackoverflow.com/questions/5836335/… . Sementes aleatórias também são comuns para criar resultados reproduzíveis para pesquisa. Por exemplo, se você é um cientista de dados e deseja publicar seus resultados com algum tipo de modelo que use aleatoriedade (por exemplo, uma floresta aleatória), inclua uma semente no código publicado para que as pessoas possam garantir cálculos são reproduzíveis.
Galen Long

89

Todas as outras respostas parecem não explicar o uso de random.seed (). Aqui está um exemplo simples ( fonte ):

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

Você tenta isso.

Digamos que 'random.seed' dê um valor ao gerador de valor aleatório ('random.randint ()') que gera esses valores com base nessa semente. Uma das propriedades obrigatórias dos números aleatórios é que eles devem ser reproduzíveis. Quando você coloca a mesma semente, obtém o mesmo padrão de números aleatórios. Dessa forma, você os está gerando desde o início. Você fornece uma semente diferente - ela começa com uma inicial diferente (acima de 3).

Dada uma semente, ela gerará números aleatórios entre 1 e 10, um após o outro. Então você assume um conjunto de números para um valor inicial.


15

Um número aleatório é gerado por alguma operação no valor anterior.

Se não houver valor anterior, o horário atual será automaticamente como valor anterior. Podemos fornecer esse valor anterior por conta própria usando random.seed(x)wherex pode haver qualquer número ou sequência etc.

Portanto, random.random()não é realmente um número aleatório perfeito, poderia ser previsto via 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

Portanto, gerar um número aleatório não é realmente aleatório, porque é executado em algoritmos. Os algoritmos sempre fornecem a mesma saída com base na mesma entrada. Isso significa que depende do valor da semente. Portanto, para torná-lo mais aleatório, o tempo é atribuído automaticamente aseed() .


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))

Execute o programa acima várias vezes ...

1ª tentativa: imprime 5 números inteiros aleatórios no intervalo de 1 a 100

2ª tentativa: imprime os mesmos 5 números aleatórios exibidos na execução acima.

3ª tentativa: mesma

.....Em breve

Explicação: Toda vez que estamos executando o programa acima, estamos configurando seed para 10, então o gerador aleatório toma isso como uma variável de referência. E então, fazendo alguma fórmula predefinida, gera um número aleatório.

Portanto, definir a semente como 10 na próxima execução novamente define o número de referência como 10 e, novamente, o mesmo comportamento começa ...

Assim que redefinimos o valor da semente, ele fornece as mesmas plantas.

Nota: Altere o valor inicial e execute o programa, você verá uma sequência aleatória diferente da anterior.


7

Nesse caso, aleatório é realmente pseudo-aleatório. Dada uma semente, ela gerará números com uma distribuição igual. Mas com a mesma semente, ele gerará a mesma sequência numérica toda vez. Se você quiser mudar, precisará alterar sua semente. Muitas pessoas gostam de gerar uma semente com base no tempo atual ou algo assim.


6

Imho, é usado para gerar o mesmo resultado de curso aleatório quando você usa random.seed(samedigit)novamente.

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

Defina o seed(x)antes de gerar um conjunto de números aleatórios e use a mesma semente para gerar o mesmo conjunto de números aleatórios. Útil no caso de reproduzir os problemas.

>>> 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

Aqui está o meu entendimento. Sempre que configuramos um valor inicial, um "rótulo" ou "referência" é gerado. A próxima chamada random.function é anexada a esse "rótulo"; portanto, da próxima vez que você chamar o mesmo valor inicial e random.function, ele fornecerá o mesmo 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

Aqui está um pequeno teste que demonstra que alimentar o seed()método com o mesmo argumento causará o mesmo resultado pseudo-aleatório:

# 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)

4
Verificação de igualdade mais curta:len(set(l))<=1
Oliver Ni

0

random.seed(a, version)em python é usado para inicializar o gerador de números pseudo-aleatórios (PRNG) .

PRNG é um algoritmo que gera sequência de números aproximando-se das propriedades de números aleatórios. Esses números aleatórios podem ser reproduzidos usando o valor de semente . Portanto, se você fornecer um valor inicial, o PRNG iniciará de um estado inicial arbitrário usando uma semente.

Argumento a é o valor inicial. Se o valor a forNone , então, por padrão, a hora atual do sistema será usada.

e versioné um número inteiro especificando como converter o parâmetro a em um número inteiro. O valor padrão é 2.

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

Se você deseja que o mesmo número aleatório seja reproduzido, forneça a mesma semente novamente

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

Se você não fornecer a semente, ela gera um número diferente e não 1 como antes

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

Se você fornecer sementes diferentes das anteriores , ele fornecerá um número aleatório diferente

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

Portanto, em resumo, se você deseja que o mesmo número aleatório seja reproduzido, forneça a semente. Especificamente, a mesma semente .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.