Générer des nombres aléatoires sans répéter.C #

Bonjour à tous, j’essaie de générer 6 numéros différents sur la même ligne en c #, mais le problème auquel je suis confronté est que certains des numéros se répètent sur la même ligne.

List listNumbers = new List(); int numbers = rand.Next(1,49); for (int i= 0 ; i < 6 ;i++) { listNumbers.Add(numbers); numbers = rand.Next(1,49); } 

quelque part ma sortie est

  17 23 23 31 33 48 

Vérifiez chaque numéro que vous générez par rapport aux numéros précédents:

 List listNumbers = new List(); int number; for (int i = 0; i < 6; i++) { do { number = rand.Next(1, 49); } while (listNumbers.Contains(number)); listNumbers.Add(number); } 

Une autre approche consiste à créer une liste de nombres possibles et à supprimer les numéros que vous choisissez dans la liste:

 List possible = Enumerable.Range(1, 48).ToList(); List listNumbers = new List(); for (int i = 0; i < 6; i++) { int index = rand.Next(0, possible.Count); listNumbers.Add(possible[index]); possible.RemoveAt(index); } 
 listNumbers.AddRange(Enumerable.Range(1, 48) .OrderBy(i => rand.Next()) .Take(6)) 

Faites-en une boucle while et ajoutez les entiers à un hashset. Arrêtez la boucle lorsque vous avez six nombres entiers.

Ce que vous faites est de générer un nombre aléatoire chaque fois dans la boucle. Il est possible que le prochain nombre aléatoire soit le même que le précédent. Il suffit d’append une vérification pour vérifier que le nombre aléatoire actuel n’est pas présent dans la séquence. Vous pouvez utiliser une boucle while comme: while (currentRandom pas dans listNumbers): generateNewRandomNumber

Au lieu d’utiliser une liste, vous devez utiliser un hachage. Le HashSet <> interdit plusieurs valeurs identiques. Et la méthode Add renvoie une valeur booléenne indiquant si l’élément a été ajouté à la liste. Veuillez trouver l’exemple de code ci-dessous.

 public static IEnumerable GetRandomNumbers(int count) { HashSet randomNumbers = new HashSet(); for (int i = 0; i < count; i++) while (!randomNumbers.Add(random.Next())); return randomNumbers; } 

La meilleure approche (en termes de temps par le processeur) pour de telles tâches consiste à créer un tableau de tous les nombres possibles et à en extraire 6 éléments tout en supprimant celui que vous venez de prendre. Exemple:

 const int min = 1, max = 49; List listNumbers = new List(); int[] numbers = new int[max - min + 1]; int i, len = max - min + 1, number; for (i = min; i < max; i++) numbers[i - min] = i; for (i = 0; i < 6; i++) { number = rand.Next(0, len - 1); listNumbers.Add(numbers[number]); if (number != (len - 1)) numbers[number] = numbers[len - 1]; len--; } 

J’ai commuté votre boucle for avec une boucle do … while et ai défini la condition d’arrêt du décompte de la liste comme étant inférieure à 6. Ce n’est peut-être pas la meilleure solution, mais c’est la plus proche de votre code d’origine.

 List listNumbers = new List(); do { int numbers = rand.Next(1,49); if(!listNumbers.Contains(number)) { listNumbers.Add(numbers); } } while (listNumbers.Count < 6) 

Collez le ci-dessous dans la classe en tant que nouvelle méthode

  public int randomNumber() { var random = new Random(); int randomNumber = random.Next(10000, 99999); return randomNumber; } 

Et utilisez le ci-dessous n’importe où dans les tests, le cas échéant

var RandNum = randomNumber ();

driver.FindElement (By.CssSelector (“[class = ‘test’]”)). SendKeys ( RandNum );

Créer un hachage et générer un nombre aléatoire unique

 public List GetRandomNumber(int from,int to,int numberOfElement) { var random = new Random(); HashSet numbers = new HashSet(); while (numbers.Count < numberOfElement) { numbers.Add(random.Next(from, to)); } return numbers.ToList(); } 
  public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int[] que = new int[6]; int x, y, z; Random ran = new Random(); for ( x = 0; x < 6; x++) { que[x] = ran.Next(1,49); for (y = x; y >= 0; y--) { if (x == y) { continue; } if (que[x] == que[y]) { que[x] = ran.Next(1,49); y = x; } } } listBox1.Items.Clear(); for (z = 0; z < 6**strong text**; z++) { listBox1.Items.Add(que[z].ToString()); } } }