Heim > Backend-Entwicklung > C++ > Warum erzeugen wiederholte Aufrufe von `random.next ()` in einer engen Schleife identische Zahlen?

Warum erzeugen wiederholte Aufrufe von `random.next ()` in einer engen Schleife identische Zahlen?

Mary-Kate Olsen
Freigeben: 2025-02-03 08:26:42
Original
414 Leute haben es durchsucht

Why Do Repeated Calls to `Random.Next()` in a Tight Loop Produce Identical Numbers?

in Schleifen effizient zufällige Zahlen erzeugen

Der folgende Code -Snippet zeigt eine gemeinsame Falle, wenn zufällige Zahlen innerhalb einer Schleife generiert werden:

<code class="language-csharp">// Inefficient random number generation
public static int RandomNumber(int min, int max)
{
    Random random = new Random();
    return random.Next(min, max);
}</code>
Nach dem Login kopieren

diese Funktion wiederholt in einer engen Schleife aufrufen, zum Beispiel:

<code class="language-csharp">byte[] mac = new byte[6];
for (int x = 0; x < 6; x++)
{
    mac[x] = (byte)RandomNumber(0, 255);
}</code>
Nach dem Login kopieren

führt häufig zu identischen Werten innerhalb des mac -Arrays. Dies liegt daran, dass Random in jeder Iteration mit der Systemuhr neu initialisiert wird. Wenn die Schleife schnell ausgeführt wird, hat sich die Uhr nicht wesentlich verändert, was zu demselben Samen und damit derselben Folge von "zufälligen" Zahlen führt.

Die Lösung: eine einzelne gemeinsame Instanz

Der korrekte Ansatz besteht darin, eine einzelne Random Instanz zu erstellen und es während der gesamten Schleife wiederzuverwenden. Die Sicherheit der Threads sollte auch für Anwendungen mit mehreren Threads berücksichtigt werden. Hier ist eine verbesserte Version:

<code class="language-csharp">// Efficient and thread-safe random number generation
private static readonly Random random = new Random();
private static readonly object syncLock = new object();

public static int RandomNumber(int min, int max)
{
    lock (syncLock)
    {
        return random.Next(min, max);
    }
}</code>
Nach dem Login kopieren

Durch die Verwendung einer static readonly -Instanz stellen wir sicher, dass nur ein Random Objekt erstellt wird. Die lock -Anweisung schützt vor Rassenbedingungen in Multi-Thread-Szenarien und garantiert, dass nur ein Thread jeweils auf die random.Next() -Methode zugreift. Dies behält die Integrität und Zufälligkeit der generierten Zahlen bei.

Das obige ist der detaillierte Inhalt vonWarum erzeugen wiederholte Aufrufe von `random.next ()` in einer engen Schleife identische Zahlen?. 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