random.seed (): Was macht es?

177

Ich bin etwas verwirrt darüber, was random.seed()in Python funktioniert. Warum machen die folgenden Versuche zum Beispiel das, was sie tun (konsequent)?

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

Ich konnte keine gute Dokumentation dazu finden.

Ahaan S. Rungta
quelle
30
Die Erzeugung von Zufallszahlen ist nicht wirklich "zufällig". Es ist deterministisch und die von ihm erzeugte Sequenz wird durch den Startwert bestimmt, in den Sie übergehen random.seed. Normalerweise rufen Sie nur auf random.seed()und es wird die aktuelle Zeit als Startwert verwendet. Dies bedeutet, dass Sie bei jeder Ausführung des Skripts eine andere Folge von Werten erhalten.
Asad Saeeduddin
3
Wenn Sie denselben Startwert zufällig übergeben und dann aufrufen, erhalten Sie denselben Satz von Zahlen. Dies funktioniert wie beabsichtigt, und wenn Sie möchten, dass die Ergebnisse jedes Mal anders sind, müssen Sie sie bei jedem Start einer App mit etwas anderem versehen (z. B. Ausgabe von / dev / random oder time)
Tymoteusz Paul
5
Der Samen wird dem RNG zugeführt, um die erste Zufallszahl zu erzeugen. Danach wird das RNG selbst ernährt. Aus diesem Grund sehen Sie nicht immer die gleiche Antwort. Wenn Sie dieses Skript erneut ausführen, erhalten Sie dieselbe Folge von "Zufallszahlen". Das Festlegen des Startwerts ist hilfreich, wenn Sie Ergebnisse reproduzieren möchten, da alle generierten "Zufallszahlen" immer gleich sind.
Blink
Erwähnenswert: Die in diesem Beitrag gezeigte Sequenz ist in Python 2. Python 3 gibt eine andere Sequenz an.
Ggorlen
1
Die Verwendung von "Zufallszahlen" durch @Blink ist irreführend. Das RNG hat einen internen Zustand, der selbst gespeist wird. Aus diesem internen Zustand werden Ausgaben für Randint (1,10) und andere Aufrufe abgeleitet. Wenn das RNG von der Ausgabe von Randint (1,10) gespeist würde, würde die Sequenz auf 1 von höchstens 10 Sequenzen kollabieren und die Sequenz würde sich nach höchstens 10 Zahlen wiederholen.
Joachim Wagner

Antworten:

213

Pseudozufallszahlengeneratoren arbeiten, indem sie eine Operation an einem Wert ausführen. Im Allgemeinen ist dieser Wert die vorherige vom Generator generierte Zahl. Wenn Sie den Generator zum ersten Mal verwenden, gibt es jedoch keinen vorherigen Wert.

Das Setzen eines Pseudozufallszahlengenerators gibt ihm seinen ersten "vorherigen" Wert. Jeder Startwert entspricht einer Folge von generierten Werten für einen bestimmten Zufallszahlengenerator. Das heißt, wenn Sie zweimal denselben Startwert angeben, erhalten Sie zweimal dieselbe Zahlenfolge.

Im Allgemeinen möchten Sie Ihren Zufallszahlengenerator mit einem Wert versehen, der jede Ausführung des Programms ändert. Zum Beispiel ist die aktuelle Zeit ein häufig verwendeter Startwert. Der Grund, warum dies nicht automatisch geschieht, besteht darin, dass Sie bei Bedarf einen bestimmten Startwert angeben können, um eine bekannte Folge von Zahlen zu erhalten.

Eric Finn
quelle
39
Vielleicht ist es erwähnenswert, dass wir manchmal Startwert geben möchten, damit bei jedem Programmlauf dieselbe zufällige Sequenz generiert wird. Manchmal wird Zufälligkeit in Softwareprogrammen vermieden, um das Programmverhalten deterministisch zu halten und die Möglichkeit zu geben, die Probleme / Fehler zu reproduzieren.
ViFI
1
Wenn Sie den Anweisungen des @ViFI folgen und das Programmverhalten deterministisch halten (mit einem festen Startwert oder einer festgelegten Reihenfolge von Startwerten), können Sie auch besser beurteilen, ob eine Änderung Ihres Programms von Vorteil ist oder nicht.
Shaneb
Würde es Ihnen etwas ausmachen, mit einem realen Szenario zu erklären? Ich kann einen Anwendungsfall für dasselbe nicht verstehen. Haben wir etwas Ähnliches auch in anderen Programmiersprachen?
Shashank Vivek
1
Hier ist ein reales Szenario: stackoverflow.com/questions/5836335/… . Zufällige Samen sind auch üblich, um reproduzierbare Ergebnisse für die Forschung zu erzielen. Wenn Sie beispielsweise ein Datenwissenschaftler sind und Ihre Ergebnisse mit einem Modell veröffentlichen möchten, das Zufälligkeit verwendet (z. B. eine zufällige Gesamtstruktur), möchten Sie einen Startwert in Ihren veröffentlichten Code aufnehmen, damit die Benutzer sicherstellen können, dass Ihre Ergebnisse vorliegen Berechnungen sind reproduzierbar.
Galen Long
89

Alle anderen Antworten scheinen die Verwendung von random.seed () nicht zu erklären. Hier ist ein einfaches Beispiel ( Quelle ):

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
Ritesh Karwa
quelle
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

Du versuchst das.

Angenommen, 'random.seed' gibt dem Zufallswertgenerator ('random.randint ()') einen Wert, der diese Werte auf der Grundlage dieses Startwerts generiert. Eine der wichtigsten Eigenschaften von Zufallszahlen ist, dass sie reproduzierbar sein sollten. Wenn Sie denselben Samen setzen, erhalten Sie das gleiche Muster von Zufallszahlen. Auf diese Weise generieren Sie sie von Anfang an. Sie geben einen anderen Samen - es beginnt mit einer anderen Initiale (über 3).

Bei einem Startwert werden nacheinander Zufallszahlen zwischen 1 und 10 generiert. Sie nehmen also einen Satz von Zahlen für einen Startwert an.

Yogesh
quelle
15

Eine Zufallszahl wird durch eine Operation mit dem vorherigen Wert erzeugt.

Wenn es keinen vorherigen Wert gibt, wird die aktuelle Zeit automatisch als vorheriger Wert angezeigt. Wir können diesen vorherigen Wert durch eigene liefern mit random.seed(x)denen xbeliebige Zahl oder String usw. sein könnte

Daher random.random()ist eigentlich keine perfekte Zufallszahl, sie könnte über vorhergesagt werden 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

Daher ist das Erzeugen einer Zufallszahl nicht wirklich zufällig, da es auf Algorithmen läuft. Algorithmen liefern immer die gleiche Ausgabe basierend auf der gleichen Eingabe. Dies bedeutet, dass es vom Wert des Samens abhängt. Um es zufälliger zu machen, wird die Zeit automatisch zugewiesen seed().

abhay Maurya
quelle
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])
>>>
Gour Bera
quelle
11
# Simple Python program to understand random.seed() importance

import random

random.seed(10)

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

Führen Sie das obige Programm mehrmals aus ...

1. Versuch: Gibt 5 zufällige Ganzzahlen im Bereich von 1 bis 100 aus

2. Versuch: Druckt die gleichen 5 Zufallszahlen, die in der obigen Ausführung erschienen sind.

3. Versuch: gleich

.....Demnächst

Erläuterung: Jedes Mal, wenn wir das obige Programm ausführen, setzen wir den Startwert auf 10, und der Zufallsgenerator verwendet dies als Referenzvariable. Durch eine vordefinierte Formel wird eine Zufallszahl generiert.

Wenn Sie also bei der nächsten Ausführung den Startwert auf 10 setzen, wird die Referenznummer erneut auf 10 gesetzt, und das gleiche Verhalten beginnt erneut ...

Sobald wir den Samenwert zurücksetzen, erhalten wir die gleichen Pflanzen.

Hinweis: Ändern Sie den Startwert und führen Sie das Programm aus. Es wird eine andere zufällige Reihenfolge als die vorherige angezeigt.

Brahma
quelle
7

In diesem Fall ist zufällig tatsächlich pseudozufällig. Bei einem Startwert werden Zahlen mit gleicher Verteilung generiert. Mit demselben Startwert wird jedoch jedes Mal dieselbe Zahlenfolge generiert. Wenn Sie möchten, dass es sich ändert, müssen Sie Ihren Samen ändern. Viele Leute generieren gerne einen Samen basierend auf der aktuellen Zeit oder so.

Suavidas
quelle
6

Imho, es wird verwendet, um das gleiche zufällige Kursergebnis zu generieren, wenn Sie es random.seed(samedigit)erneut verwenden.

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
未来 陆家嘴 顶尖 的 投资 人
quelle
4

Stellen Sie die seed(x)vor dem Generieren eines Satzes von Zufallszahlen ein und verwenden Sie denselben Startwert, um denselben Satz von Zufallszahlen zu erzeugen. Nützlich bei der Reproduktion der Probleme.

>>> 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
>>> 
user3221795
quelle
3

Hier ist mein Verständnis. Jedes Mal, wenn wir einen Startwert festlegen, wird ein "Label" oder eine "Referenz" generiert. Der nächste random.function-Aufruf ist an dieses "Label" angehängt. Wenn Sie also das nächste Mal denselben Startwert und dieselbe random.function aufrufen, erhalten Sie dasselbe Ergebnis.

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
Vicky Miao
quelle
1

Hier ist ein kleiner Test, der zeigt, dass das Füttern der seed()Methode mit demselben Argument dasselbe pseudozufällige Ergebnis verursacht:

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

quelle
4
Kürzere Gleichstellungsprüfung:len(set(l))<=1
Oliver Ni
0

random.seed(a, version)in Python wird verwendet, um den Pseudozufallszahlengenerator (PRNG) zu initialisieren .

PRNG ist ein Algorithmus, der eine Folge von Zahlen erzeugt, die sich den Eigenschaften von Zufallszahlen annähert. Diese Zufallszahlen können mit dem Startwert reproduziert werden . Wenn Sie also einen Startwert angeben, beginnt PRNG mit einem Startwert aus einem beliebigen Startzustand.

Argument a ist der Startwert. Wenn der a-Wert istNone , wird standardmäßig die aktuelle Systemzeit verwendet.

und versionist eine Ganzzahl, die angibt, wie der Parameter a in eine Ganzzahl konvertiert wird. Der Standardwert ist 2.

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

Wenn Sie möchten, dass dieselbe Zufallszahl reproduziert wird, geben Sie erneut denselben Startwert ein

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

Wenn Sie den Startwert nicht angeben, wird eine andere Nummer generiert und nicht wie zuvor 1

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

Wenn Sie einen anderen Startwert als zuvor angeben, erhalten Sie eine andere Zufallszahl

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

Wenn Sie also zusammenfassend die gleiche Zufallszahl reproduzieren möchten, geben Sie den Startwert an. Insbesondere der gleiche Samen .

Santosh
quelle