Eviter les doublons aléatoires

System.Random generator = new Random(DateTime.Now.Millisecond); int[] lotteryNumber = new int[7]; Console.WriteLine("Your lottery numbers: "); for (int i = 0; i<7; i++) { lotteryNumber[i] = generator.Next(1, 37); Console.Write("{0} ",lotteryNumber[i]); } Console.ReadLine(); 

Je dois créer un programme qui imprime 7 numéros de loterie, mais sans doublons. Le code ci-dessus imprime 7 nombres aléatoires compris entre 1 et 37, mais les doublons apparaissent. J’ai besoin d’un moyen d’empêcher les numéros en double d’apparaître.

L’approche la plus simple consiste à générer une séquence de tous les nombres possibles (1 à 37), à mélanger la collection, puis à prendre les sept premiers résultats.

En recherchant “Fisher-Yates shuffle C #”, vous trouverez de nombreux exemples.

En fait, vous pouvez modifier le shuffle de Fisher-Yates pour obtenir des résultats tels que vous les avez pris. Vous pouvez ainsi écrire une méthode telle que:

 var numbers = Enumerable.Range(1, 37).Shuffle().Take(7).ToList(); 

Vous pouvez utiliser un dictionnaire mais assurez-vous de ne pas insérer de clés en double. Les clés du dictionnaire serviraient de numéros uniques dont vous avez besoin

Vous pouvez les jeter dans un HashSet . Si vous Add et qu’il renvoie false, générez un nouveau numéro.

Si vous essayez de choisir des nombres dans une plage sans répétitions , vous devez créer un tableau de tous les nombres possibles, puis “mélanger” une sélection aléatoire:

 int[] allPossibleNumbers = Enumerable.Range(1, 37).ToArray(); int[] lotteryNumber = new int[7]; for (int i = 0; i < 7; i++) { int index = r.Next(i, 37); lotteryNumber[i] = allPossibleNumbers[index]; allPossibleNumbers[index] = allPossibleNumbers[i]; // This step not necessary, but allows you to reuse allPossibleNumbers // rather than generating a fresh one every time. // allPossibleNumbers[i] = lotteryNumber[i]; } 

Générez une liste avec vos 37 éléments. Puis dans votre for, sélectionnez-en un et supprimez le

Peut-être que cela pourrait aider, si vous obtenez le numéro existant, essayez simplement d’en trouver un nouveau qui ne figure pas dans le tableau:

 static void Main(ssortingng[] args) { System.Random generator = new Random(DateTime.Now.Millisecond); int[] lotteryNumber = new int[7]; Console.WriteLine("Your lottery numbers: "); for (int i = 0; i < 7; i++) { int lNumber = 0; do { lNumber = generator.Next(1, 37); } while (lotteryNumber.Contains(lNumber)); lotteryNumber[i] = lNumber; Console.Write("{0} ", lotteryNumber[i]); } Console.ReadLine(); } 
 HashSet set = new HashSet(); System.Random generator = new Random(DateTime.Now.Millisecond); while(set.Count < 7){ set.Add(generator.Next(1,37); } 

Cela devrait fonctionner, puisqu'un HashSet ignorera automatiquement les doublons. Bouclez-vous jusqu'à ce que le jeu atteigne le nombre d'unités dont vous avez besoin Le seul problème potentiel est qu'il a le potentiel (peu probable) de boucler pendant une longue période, mais il devrait éventuellement réagir.

j’ai donc pris votre code d’origine … trouvé quelques erreurs de logique et ajouté le correctif que vous recherchiez pour éviter les doublons de nombres aléatoires.

Prendre plaisir!

  System.Random generator = new Random(DateTime.Now.Millisecond); int[] lotteryNumber = new int[7]; int lowerBounds = 1; int upperBounds = 8; int maxNumberLotteryValues = 7; if ( ( upperBounds - lowerBounds ) < (maxNumberLotteryValues)) { Console.Write("Warning: Adjust your upper and lower bounds...there are not enough values to create a unique set of Lottery numbers! "); } else { Console.WriteLine("Your lottery numbers: "); for (int i = 0; i < maxNumberLotteryValues; i++) { int nextNumber = generator.Next(lowerBounds, upperBounds); int count = lowerBounds; //Prevent infinite loop while ((lotteryNumber.Contains(nextNumber)) && (count <= upperBounds)) { nextNumber = generator.Next(lowerBounds, upperBounds); count++; //Prevent infinite loop } lotteryNumber[i] = nextNumber; Console.Write("{0} ", lotteryNumber[i]); } } Console.ReadLine(); 
 const int nBalls = 37; const int nPicks = 6; int[] balls = new int[nPicks]; Random rnd = new Random(DateTime.Now.Millisecond); int remainingBalls=nBalls; int remainingPicks=nPicks; for (int i = 1; i <= nBalls; i++) { if (rnd.Next(1, remainingBalls+1) <= remainingPicks) balls[--remainingPicks]=i; remainingBalls--; } Console.WriteLine(string.Join(",",balls)); 

Surperformera les méthodes Shuffle et HashSet à mesure que nPicks / nBalls s'agrandit.