Maison > développement back-end > C++ > Pourquoi les appels répétés à `aléatoire.Next ()' dans une boucle serrée produisent-ils des nombres identiques?

Pourquoi les appels répétés à `aléatoire.Next ()' dans une boucle serrée produisent-ils des nombres identiques?

Mary-Kate Olsen
Libérer: 2025-02-03 08:26:42
original
496 Les gens l'ont consulté

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

Génération de nombres aléatoires efficacement dans les boucles

l'extrait de code suivant montre un écueil commun lors de la génération de nombres aléatoires dans une boucle:

// Inefficient random number generation
public static int RandomNumber(int min, int max)
{
    Random random = new Random();
    return random.Next(min, max);
}
Copier après la connexion

Appeler cette fonction à plusieurs reprises dans une boucle serrée, par exemple:

byte[] mac = new byte[6];
for (int x = 0; x < 6; x++)
{
    mac[x] = (byte)RandomNumber(0, 255);
}
Copier après la connexion

entraînera souvent des valeurs identiques dans le tableau mac. En effet, Random est réinitialisé avec l'horloge du système dans chaque itération. Si la boucle s'exécute rapidement, l'horloge n'a pas changé de manière significative, résultant en la même graine et donc la même séquence de nombres "aléatoires".

La solution: une seule instance partagée

L'approche correcte consiste à créer une seule instance Random et à la réutiliser dans toute la boucle. La sécurité des threads doit également être envisagée pour les applications multi-thread. Voici une version améliorée:

// 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);
    }
}
Copier après la connexion

En utilisant une instance static readonly, nous nous assurons qu'un seul objet Random est créé. L'instruction lock protège contre les conditions de course dans des scénarios multithreads, garantissant qu'un seul thread accède à la méthode random.Next() à la fois. Cela maintient l'intégrité et l'aléatoire des nombres générés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal