Heim >Backend-Entwicklung >C++ >Warum erzeugen wiederholte Aufrufe von `random.next ()` in einer engen Schleife identische Zahlen?
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>
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>
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>
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!