Maison >développement back-end >C++ >Pourquoi mon générateur de nombres aléatoires produit-il le même nombre à plusieurs reprises?

Pourquoi mon générateur de nombres aléatoires produit-il le même nombre à plusieurs reprises?

DDD
DDDoriginal
2025-02-03 08:32:091003parcourir

Why Does My Random Number Generator Produce the Same Number Repeatedly?

Comprendre et fixer des nombres aléatoires répétés dans la programmation

Un problème de programmation fréquente implique des générateurs de nombres aléatoires (RNG) qui sortent à plusieurs reprises le même nombre. Cela se produit généralement lorsque le RNG est réinitialisé plusieurs fois dans une boucle, créant de nouvelles instances Random.

Le problème expliqué

Examinons ce problème avec un exemple:

<code class="language-csharp">public static int RandomNumber(int min, int max) {
    Random random = new Random(); // Problem: New instance each time
    return random.Next(min, max);
}

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

Le débogage peut montrer des valeurs variables au cours de chaque itération de boucle. Cependant, la définition d'un point d'arrêt après la boucle révèle que tous les éléments du tableau mac maintiennent la même valeur.

La solution: une seule instance aléatoire

La cause profonde consiste à créer un nouvel objet Random dans la boucle. Puisque Random utilise souvent l'horloge du système pour l'ensemencement, la création de plusieurs instances en succession rapide conduit à des valeurs de graines identiques et donc, des nombres répétés.

La solution est simple: utilisez une seule instance statique de Random tout au long de votre code:

<code class="language-csharp">private static readonly Random random = new Random();

public static int RandomNumber(int min, int max) {
    return random.Next(min, max);
}

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

Multithreading and Thread Safety

Dans les applications multithread, l'accès à une instance partagée Random nécessite une synchronisation pour éviter les conditions de course. Cela peut être réalisé en utilisant une serrure:

<code class="language-csharp">
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);
    }
}
```  This ensures thread safety when generating random numbers concurrently.</code>

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