Random.Next renvoie toujours les mêmes valeurs

C’est vraiment bizarre et je ne vois pas pourquoi cela se produit. Dans le cycle foreach, je parcourt une collection de classes A et j’appelle la méthode Count() pour chaque classe, où les nombres r1 et r2 sont générés à partir de la plage [-1,1]. Le problème est que Random.Next renvoie les mêmes nombres “aléatoires” pour chaque instance. Lorsque les résultats pour la première instance sont 0 et -1, les mêmes seront retournés à partir des instances suivantes. Pouvez-vous me dire pourquoi cela se produit? De plus, je ne peux pas obtenir de résultats différents dans chaque instance de classe A. Ceci est le code:

 class a { Random rnd = new Random(); private void Count() { int r1 = rnd.Next(-1, 1); int r2 = rnd.Next(-1, 1); } } class b { List listofA=new list(); foreach (a ACLASS in listofA) { ACLASS.Count(); } } 

Le problème est que vous créez des instances de la classe Random trop près dans le temps.

Lorsque vous créez un object Random , il est associé à une valeur provenant de l’horloge système. Si vous créez des instances Random trop proches dans le temps, elles seront toutes classées avec la même séquence aléatoire.

Créez un seul object Random et transmettez sa référence au constructeur lorsque vous créez des instances de la classe “a”, au lieu de créer un object Random pour chaque instance “a”.

Vous créez une nouvelle instance de Random très proche (votre boucle est très serrée), donc chaque instance utilise effectivement la même valeur de départ.

Une meilleure approche serait de créer une instance et de la transmettre à votre méthode Count .

Vous savez probablement ce bit suivant, mais je vais l’inclure ici pour compléter:

MSDN a les détails à ce sujet, mais en gros, votre problème est la méthode Random.Next que vous utilisez génère:

Un entier signé de 32 bits supérieur ou égal à minValue et inférieur à maxValue; c’est-à-dire que la plage de valeurs de retour inclut minValue mais pas maxValue. Si minValue est égal à maxValue, minValue est renvoyé.

à cause de cela, vos appels renverront -1 ou 0.

Utilisez un seul générateur de nombres aléatoires statique pour toutes les instances de la classe.

 class a { private static Random rnd; static a() { rnd = new Random(); } private void Count() { int r1 = rnd.Next(-1, 2); int r2 = rnd.Next(-1, 2); } } 

Notez le changement pour vous donner des nombres dans la plage -1,1 plutôt que -1,0

Vous incluez une instance aléatoire pour chaque instance A. Il semble qu’ils obtiennent tous la même valeur de graine par défaut. Vous souhaiterez probablement créer un aléatoire statique pour toutes les instances A et l’utiliser de manière répétée, ou encore fournir une valeur de départ à l’instance Random () du constructeur A.