Deterministische Zufallszahlengenerierung in Go
In Go erfolgt der Aufruf von rand.Intn(n int) int ohne Seeding des Zufallszahlengenerators immer gibt die gleiche Zahlenfolge zurück. Dies liegt daran, dass die für die Zufallszahlengenerierung verwendete Standardquelle mit einem festen Startwert initialisiert wird, was sie effektiv deterministisch macht.
Warum passiert das?
Wie im erwähnt In der offiziellen Dokumentation gibt die Funktion rand.Intn eine Pseudozufallszahl zurück, die mithilfe eines deterministischen Algorithmus und eines Startwerts generiert wird. Wenn der Startwert nicht angegeben ist, wird der Standardstartwert 1 verwendet, was zur Generierung der gleichen Zahlenreihe in jedem Durchlauf führt.
Richtiges Seeding der Zufallszahlengenerierung
Um echte Zufallszahlen zu generieren, ist es wichtig, den Zufallszahlengenerator für jeden Lauf mit einem anderen Startwert zu versehen. Dies kann erreicht werden, indem die Funktion rand.Seed() aufgerufen und ihr ein zufälliger Startwert übergeben wird. Eine gängige Praxis besteht darin, den aktuellen Unix-Zeitstempel als Startwert zu verwenden, wodurch sichergestellt wird, dass der Generator für jede Ausführung mit einem eindeutigen Wert initialisiert wird.
Beispiel:
<code class="go">import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) fmt.Println(rand.Intn(10)) }</code>
Fazit
Durch das richtige Seeding des Zufallszahlengenerators können Sie sicherstellen, dass Ihre Go-Programme wirklich Zufallszahlen erzeugen, wodurch diese unvorhersehbarer werden und den wahren Zufall eher widerspiegeln.
Das obige ist der detaillierte Inhalt vonWarum führt der Aufruf von „rand.Intn' ohne Seeding zur gleichen Zahlenfolge in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!