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!