Heim >Backend-Entwicklung >C++ >Warum erzeugt mein C#-Zufallszahlengenerator dieselbe Sequenz über mehrere Objekte hinweg?
Zufallszahlengenerierung in C# verstehen und Sequenzwiederholungen vermeiden
Dieser Artikel befasst sich mit einem häufigen Problem in C#: Mehrere Instanzen der Random
-Klasse erzeugen identische Zufallszahlensequenzen. Die Random
-Klasse ist zwar für die Generierung scheinbar unvorhersehbarer Zahlen konzipiert, verlässt sich jedoch auf einen Startwert für ihren internen Algorithmus. Wenn mehrere Random
-Objekte schnell hintereinander erstellt werden, erhalten sie häufig ähnliche Startwerte (häufig basierend auf der Systemuhr), was zu identischen Ausgabesequenzen führt.
Das Problem: Mehrere Random
Instanzen
Das Erstellen einer neuen Random
Instanz für jedes Objekt, das Zufallszahlen benötigt, ist die Hauptursache. Da die Startwerte nahe beieinander liegen, sind die generierten Sequenzen nahezu identisch.
Die Lösung: Eine einzelne, gemeinsam genutzte Random
Instanz
Die Lösung ist unkompliziert: Erstellen Sie eine einzelne Random
Instanz und teilen Sie sie mit allen Objekten, die Zufallszahlen erfordern. Dadurch wird sichergestellt, dass jedes Objekt aus der gleichen, sich entwickelnden Sequenz stammt, wodurch das Wiederholungsproblem vermieden wird.
So implementieren Sie dies mit einem statischen Mitglied:
<code class="language-csharp">class A { private static readonly Random rnd = new Random(); // Static, read-only instance public void Count() { int r1 = rnd.Next(-1, 1); int r2 = rnd.Next(-1, 1); } } class B { List<A> listOfA = new List<A>(); public void DoSomething() { foreach (A aClass in listOfA) { aClass.Count(); } } }</code>
Durch die Verwendung eines static readonly
-Felds stellen wir sicher, dass eine einzelne Random
-Instanz einmal erstellt und von allen Instanzen der Klasse A
gemeinsam genutzt wird. Dies eliminiert das Risiko doppelter Startwerte und garantiert eindeutige Zufallszahlensequenzen für jeden Aufruf von rnd.Next()
. Dieser Ansatz erzeugt wirklich zufällige und unterschiedliche Sequenzen für jedes A
Objekt.
Das obige ist der detaillierte Inhalt vonWarum erzeugt mein C#-Zufallszahlengenerator dieselbe Sequenz über mehrere Objekte hinweg?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!