Heim > Backend-Entwicklung > C++ > Warum geben mehrere Random.Next-Instanzen identische Werte zurück?

Warum geben mehrere Random.Next-Instanzen identische Werte zurück?

Susan Sarandon
Freigeben: 2025-01-24 23:31:09
Original
873 Leute haben es durchsucht

Why Do Multiple Random.Next Instances Return Identical Values?

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

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!

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