Grundlegendes zur Generierung identischer Zufallszahlen in C#
Wenn Sie Zufallszahlen innerhalb einer Schleife mit mehreren Instanzen einer Klasse generieren, stellen Sie möglicherweise fest, dass Random.Next()
wiederholt dieselben Werte erzeugt. Dieses Verhalten ergibt sich aus der Art und Weise, wie die Random
-Klasse funktioniert.
Die Random
-Klasse verlässt sich auf einen Startwert, um ihre Pseudozufallszahlenfolge zu initiieren. Wenn mehrere Random
Instanzen schnell hintereinander erstellt werden, erhalten diese häufig sehr ähnliche Startwerte, was zu identischen Ausgabesequenzen führt.
Die Lösung: Eine gemeinsam genutzte Zufallsinstanz
Um dies zu umgehen, erstellen Sie, anstatt für jedes Klassenobjekt eine neue Random
-Instanz zu erstellen, eine einzelne Random
-Instanz und teilen Sie sie mit allen Instanzen Ihrer Klasse. Dadurch wird sichergestellt, dass jede Instanz aus derselben, sich entwickelnden Folge von Zufallszahlen schöpft.
Hier ist ein verbessertes Beispiel, das diesen Ansatz demonstriert:
<code class="language-csharp">public class A { private readonly Random _rnd; public A(Random rnd) { _rnd = rnd; } public void Count() { int r1 = _rnd.Next(-1, 1); // Note: Next(-1, 1) will only return -1 or 0. To get -1, 0, or 1, use Next(-1, 2) int r2 = _rnd.Next(-1, 2); // Corrected to include 1 } } public class B { private readonly List<A> _listOfA = new List<A>(); private readonly Random _rnd = new Random(); public B() { // Populate _listOfA... (Example below) for (int i = 0; i < 10; i++) { _listOfA.Add(new A(_rnd)); } } public void Process() { foreach (var aClass in _listOfA) { aClass.Count(); } } }</code>
Durch das Einfügen der gemeinsam genutzten _rnd
-Instanz in den A
-Klassenkonstruktor verwendet jede A
-Instanz denselben Zufallszahlengenerator, wodurch unterschiedliche Zufallszahlen über alle Instanzen hinweg garantiert werden. Beachten Sie die Korrektur in Next(-1,2)
, um 1 in die möglichen Ausgaben aufzunehmen.
Das obige ist der detaillierte Inhalt vonWarum geben mehrere Random.Next-Instanzen identische Werte zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!