Comprendre la génération de nombres aléatoires identiques en C #
Lors de la génération de nombres aléatoires dans une boucle en utilisant plusieurs instances d'une classe, vous pouvez observer que Random.Next()
produit les mêmes valeurs à plusieurs reprises. Ce comportement découle de la façon dont la classe Random
fonctionne.
La classe Random
s'appuie sur une valeur de graines pour initier sa séquence de nombres pseudo-aléatoires. Si plusieurs instances Random
sont créées en succession rapide, elles reçoivent souvent des valeurs de graines très similaires, résultant en des séquences de sortie identiques.
La solution: une instance aléatoire partagée
pour surmonter cela, au lieu de créer une nouvelle instance Random
pour chaque objet de classe, créez une seule instance Random
et partagez-la entre toutes les instances de votre classe. Cela garantit que chaque instance tire de la même séquence en évolution de nombres aléatoires.
Voici un exemple amélioré démontrant cette approche:
<code class="language-csharp">public class A { private readonly Random _rnd; public A(Random rnd) { _rnd = rnd; } public void Count() { int r1 = _rnd.Next(-1, 1); // Note: Next(-1, 1) will only return -1 or 0. To get -1, 0, or 1, use Next(-1, 2) int r2 = _rnd.Next(-1, 2); // Corrected to include 1 } } public class B { private readonly List<A> _listOfA = new List<A>(); private readonly Random _rnd = new Random(); public B() { // Populate _listOfA... (Example below) for (int i = 0; i < 10; i++) { _listOfA.Add(new A(_rnd)); } } public void Process() { foreach (var aClass in _listOfA) { aClass.Count(); } } }</code>
En injectant l'instance partagée _rnd
dans le constructeur de classe A
, chaque instance A
utilise le même générateur de nombres aléatoires, garantissant des nombres aléatoires distincts sur toutes les instances. Notez la correction dans Next(-1,2)
pour inclure 1 dans les sorties possibles.
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!