Probleme der Zufallszahlerzeugung in Schleifen
Dieser Artikel befasst sich mit einem gemeinsamen Problem, das bei Verwendung von Random.Next()
in Schleifen aufgetaucht ist: aufeinanderfolgende Iterationen, die identische Zufallszahlen erzeugen. Das Problem zeigt sich oft, wenn mehrere Random
-Objekte schnell nacheinander instanziiert werden.
Problemszenario:
Betrachten Sie den folgenden Code -Snippet:
<code class="language-csharp">class A { Random rnd = new Random(); public void Count() { int r1 = rnd.Next(-1, 1); int r2 = rnd.Next(-1, 1); // ... further code using r1 and r2 ... } } class B { List<A> listOfA = new List<A>(); public B() { // ... populate listOfA ... foreach (A instance in listOfA) { instance.Count(); } } }</code>
Wenn listOfA
mehrere Instanzen der Klasse A
enthält, erstellt jedes A
-Objekt seine eigene Random
Instanz. Aufgrund der Hochgeschwindigkeits-Instanziierung können diese Random
-Objekte denselben Saatgutwert erhalten (häufig aus der Systemuhr abgeleitet), was zu identischen Zufallszahlensequenzen führt.
Grundursache:
Das Problem beruht auf der Abhängigkeit von Random
Konstruktor auf die Systemuhr zum Aussaat. Wenn mehrere Random
Objekte in einem sehr kurzen Zeitrahmen erstellt werden, erhalten sie praktisch identische Saatgutwerte, was zu einer identischen Pseudo-Random-Zahlenerzeugung führt.
Lösung: einzelne zufällige Instanz
Die Lösung ist unkompliziert: Erstellen Sie eine einzelne Random
-Schunierung und verwenden Sie es in allen Fällen der Klasse A
. Dies stellt sicher, dass eine eindeutige, nicht wiederholende Folge von Zufallszahlen generiert wird.
Hier ist der korrigierte Code:
<code class="language-csharp">class A { private Random rnd; public A(Random rnd) { this.rnd = rnd; } public void Count() { int r1 = rnd.Next(-1, 1); int r2 = rnd.Next(-1, 1); // ... further code using r1 and r2 ... } } class B { Random rnd = new Random(); List<A> listOfA = new List<A>(); public B() { // ... populate listOfA, passing rnd to the constructor ... foreach (A instance in listOfA) { instance.Count(); } } }</code>
Durch die Injektion der einzelnen Random
-Instanz (rnd
) in den Class -Konstruktor A
, garantieren wir, dass alle Aufrufe zum Zeichnen von rnd.Next()
aus derselben, ordnungsgemäß ausgesetzten Sequenz. Dies eliminiert effektiv die Erzeugung doppelter Zufallszahlen.
Das obige ist der detaillierte Inhalt vonWarum erzeugt Random.Next identische Werte in aufeinanderfolgenden Loop -Iterationen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!