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
Mary-Kate OlsenOriginal
2025-02-03 08:26:42417Durchsuche

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>

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!

Stellungnahme:
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