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
Libérer: 2025-02-03 08:32:09
original
1002 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal