Heim > Backend-Entwicklung > C++ > Warum erzeugt Random.Next identische Werte in aufeinanderfolgenden Loop -Iterationen?

Warum erzeugt Random.Next identische Werte in aufeinanderfolgenden Loop -Iterationen?

Mary-Kate Olsen
Freigeben: 2025-01-24 23:36:12
Original
569 Leute haben es durchsucht

Why Does Random.Next Produce Identical Values in Consecutive Loop Iterations?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage