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
Mary-Kate Olsenoriginal
2025-02-03 08:26:42447parcourir

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:

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

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

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

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:

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

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