Avoiding random duplicates

10,078

Solution 1

The simplest approach IMO would be to generate a sequence of all the possible numbers (i.e. 1-37), shuffle the collection, then take the first seven results.

Searching on Stack Overflow for "Fisher-Yates shuffle C#" will find lots of examples.

In fact, you could modify the Fisher-Yates shuffle to yield results as you took them, so you could write a method such as:

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

Solution 2

You could take a dictionary but make sure that you prevent duplicate key insertion. Keys of dictionary would serve as the unique numbers you need

Share:
10,078

Related videos on Youtube

Leth
Author by

Leth

Updated on January 13, 2023

Comments

  • Leth
    Leth over 1 year
    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();
    

    I need to make a program that prints 7 lottery numbers, but without duplicates. The code above prints 7 random numbers in the range of (1-37), but duplicates appaer. I need a way to prevent duplicate numbers from appearing.

  • Amber
    Amber over 11 years
    this method will have an obvious overhead but will be fool proof in scrapping duplicity.
  • Leth
    Leth over 11 years
    Thanks, that worked like a charm! I've not yet learned about the first sentence of code you wrote. The "Enumerable.Range(1, 37).ToArray();" part, so i guess there must be another method for achieving the same.
  • Rawling
    Rawling over 11 years
    You could just do int[] allPossibleNumbers = new int[] { 1, 2, 3, 4, 5, /*yawn */, 36, 37 }; - mine's just the lazy version.