random.seed (): che cosa fa?


177

Sono un po 'confuso su cosa random.seed() fa Python. Ad esempio, perché le prove seguenti fanno quello che fanno (in modo coerente)?

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

Non sono riuscito a trovare una buona documentazione su questo.


30
La generazione di numeri casuali non è veramente "casuale". È deterministico e la sequenza che genera è dettata dal valore del seme in cui si passa random.seed. Solitamente invochi random.seed()e utilizza l'ora corrente come valore seed, il che significa che ogni volta che esegui lo script otterrai una diversa sequenza di valori.
Asad Saeeduddin,

3
Passare lo stesso seme a caso e poi chiamarlo ti darà lo stesso insieme di numeri. Funziona come previsto e se vuoi che i risultati siano diversi ogni volta che dovrai seminare con qualcosa di diverso ogni volta che avvii un'app (ad esempio output da / dev / random o time)
Tymoteusz Paul

5
Il seme è ciò che viene alimentato all'RNG per generare il primo numero casuale. Dopodiché, RNG si autoalimenta. Non vedi la stessa risposta in modo coerente per questo motivo. Se esegui di nuovo questo script, otterrai la stessa sequenza di numeri "casuali". L'impostazione del seed è utile se si desidera riprodurre i risultati, poiché tutti i numeri "casuali" generati saranno sempre gli stessi.
Lampeggia il

Vale la pena ricordare: la sequenza mostrata in questo post è in Python 2. Python 3 fornisce una sequenza diversa.
Ggorlen,

1
L'uso di "numero casuale" da parte di @Blink è fuorviante. L'RNG ha uno stato interno autoalimentato. Da questo stato interno, vengono derivati ​​l'output per randint (1,10) e altre chiamate. Se l'RNG si stava alimentando dall'output di randint (1,10) la sequenza sarebbe crollata su 1 al massimo di 10 sequenze e la sequenza si sarebbe ripetuta dopo al massimo 10 numeri.
Joachim Wagner,

Risposte:


213

I generatori di numeri pseudo-casuali funzionano eseguendo alcune operazioni su un valore. Generalmente questo valore è il numero precedente generato dal generatore. Tuttavia, la prima volta che si utilizza il generatore, non esiste alcun valore precedente.

Il seeding di un generatore di numeri pseudo-casuale gli dà il suo primo valore "precedente". Ogni valore di seme corrisponderà a una sequenza di valori generati per un determinato generatore di numeri casuali. Cioè, se si fornisce lo stesso seme due volte, si ottiene la stessa sequenza di numeri due volte.

In generale, si desidera eseguire il seeding del generatore di numeri casuali con un valore che cambierà ogni esecuzione del programma. Ad esempio, l'ora corrente è un seme utilizzato di frequente. Il motivo per cui ciò non accade automaticamente è che, se lo desideri, puoi fornire un seme specifico per ottenere una sequenza nota di numeri.


39
Forse vale la pena ricordare che a volte vogliamo dare seed in modo da generare la stessa sequenza casuale ad ogni esecuzione del programma. A volte, la casualità nei programmi software viene evitata per mantenere deterministico il comportamento del programma e la possibilità di riprodurre i problemi / i bug.
ViFI,

1
Seguendo quanto affermato da @ViFI, mantenere deterministico il comportamento del programma (con un seme fisso o sequenza fissa di semi) può anche consentire di valutare meglio se alcune modifiche al programma sono utili o meno.
Shaneb,

ti dispiacerebbe spiegare con uno scenario di vita reale. Non riesco a capire un caso d'uso per lo stesso. Abbiamo qualcosa di simile a questo anche in altri linguaggi di programmazione?
Shashank Vivek,

1
Ecco uno scenario di vita reale: stackoverflow.com/questions/5836335/… . I semi casuali sono anche comuni per creare risultati riproducibili per la ricerca. Ad esempio, se sei uno scienziato di dati e desideri pubblicare i tuoi risultati con un tipo di modello che utilizza la casualità (ad esempio una foresta casuale), ti consigliamo di includere un seme nel codice pubblicato in modo che le persone possano assicurarsi che il tuo i calcoli sono riproducibili.
Galen Long,

89

Tutte le altre risposte non sembrano spiegare l'uso di random.seed (). Ecco un semplice esempio ( 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

Prova questo

Diciamo 'random.seed' dà un valore al generatore di valori casuali ('random.randint ()') che genera questi valori sulla base di questo seme. Una delle proprietà indispensabili dei numeri casuali è che dovrebbero essere riproducibili. Quando metti lo stesso seme, ottieni lo stesso modello di numeri casuali. In questo modo li stai generando fin dall'inizio. Dai un seme diverso: inizia con un'iniziale diversa (sopra 3).

Dato un seme, genererà numeri casuali tra 1 e 10 uno dopo l'altro. Quindi si assume un set di numeri per un valore seme.


15

Un numero casuale viene generato da alcune operazioni sul valore precedente.

Se non esiste un valore precedente, l'ora corrente come valore precedente automaticamente. Siamo in grado di fornire questo valore precedente usando proprio random.seed(x)dove xpotrebbe essere qualsiasi numero o stringa ecc.

Quindi random.random()non è in realtà un numero casuale perfetto, potrebbe essere previsto tramite 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

Pertanto, la generazione di un numero casuale non è in realtà casuale, poiché viene eseguita su algoritmi. Gli algoritmi forniscono sempre lo stesso output in base allo stesso input. Ciò significa che dipende dal valore del seme. Quindi, per renderlo più casuale, il tempo viene automaticamente assegnato a 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))

Eseguire il programma sopra più volte ...

1o tentativo: stampa 5 numeri interi casuali nell'intervallo 1 - 100

2o tentativo: stampa gli stessi 5 numeri casuali visualizzati nell'esecuzione sopra.

3 ° tentativo: stesso

.....Presto

Spiegazione: Ogni volta che eseguiamo il programma precedente impostiamo il seed su 10, quindi il generatore casuale lo prende come variabile di riferimento. E poi eseguendo una formula predefinita, genera un numero casuale.

Quindi impostando seed su 10 nella prossima esecuzione imposta nuovamente il numero di riferimento su 10 e di nuovo lo stesso comportamento inizia ...

Non appena ripristiniamo il valore del seme, si ottengono le stesse piante.

Nota: cambia il valore seed ed esegui il programma, vedrai una sequenza casuale diversa dalla precedente.


7

In questo caso, random è in realtà pseudo-random. Dato un seme, genererà numeri con una distribuzione uguale. Ma con lo stesso seme, genererà sempre la stessa sequenza numerica. Se vuoi che cambi, dovrai cambiare il tuo seme. Molte persone amano generare un seme in base al tempo corrente o qualcosa del genere.


6

Imho, è usato per generare lo stesso risultato di rotta casuale quando lo usi di random.seed(samedigit)nuovo.

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

Impostare seed(x)prima di generare una serie di numeri casuali e utilizzare lo stesso seme per generare la stessa serie di numeri casuali. Utile in caso di riproduzione dei problemi.

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

Ecco la mia comprensione. Ogni volta che impostiamo un valore seed, viene generata una "etichetta" o "riferimento". La prossima chiamata random.function è allegata a questa "etichetta", quindi la prossima volta che chiamerai lo stesso valore seed e random.function, otterrai lo stesso risultato.

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

Ecco un piccolo test che dimostra che alimentare il seed()metodo con lo stesso argomento provocherà lo stesso risultato pseudo-casuale:

# 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
Controllo di uguaglianza più breve:len(set(l))<=1
Oliver Ni

0

random.seed(a, version)in python viene utilizzato per inizializzare il generatore di numeri pseudo-casuali (PRNG) .

PRNG è un algoritmo che genera una sequenza di numeri che si avvicinano alle proprietà di numeri casuali. Questi numeri casuali possono essere riprodotti usando il valore seed . Pertanto, se si fornisce un valore seed, PRNG inizia da uno stato iniziale arbitrario utilizzando un seed.

L'argomento a è il valore seme. Se il valore èNone , quindi per impostazione predefinita viene utilizzata l'ora di sistema corrente.

ed versionè un numero intero che specifica come convertire un parametro in un numero intero. Il valore predefinito è 2.

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

Se si desidera riprodurre lo stesso numero casuale, fornire nuovamente lo stesso seme

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

Se non fornisci il seme, genera un numero diverso e non 1 come prima

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

Se fornisci seme diverso rispetto a prima , ti darà un numero casuale diverso

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

Quindi, in sintesi, se si desidera riprodurre lo stesso numero casuale, fornire il seme. In particolare, lo stesso seme .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.