Avoiding random duplicates

后端 未结 9 1044
情深已故
情深已故 2020-12-03 19:52
System.Random generator = new Random(DateTime.Now.Millisecond);
int[] lotteryNumber = new int[7];

Console.WriteLine(\"Your lottery numbers: \");
for (int i = 0; i&l         


        
相关标签:
9条回答
  • 2020-12-03 20:31
    HashSet<int> set = new HashSet<int>();
    System.Random generator = new Random(DateTime.Now.Millisecond);
    
    while(set.Count < 7){
        set.Add(generator.Next(1,37);
    }
    

    That should work, since a HashSet will automatically ignore duplicates. Just loop until the set reaches the number of units you need. Only potential problem is it has the POTENTIAL (unlikely) to loop for a long time, but it should eventually respond.

    0 讨论(0)
  • 2020-12-03 20:32

    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();
    
    0 讨论(0)
  • 2020-12-03 20:32
    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));
    

    Will outperform Shuffle and HashSet methods as nPicks/nBalls gets larger.

    0 讨论(0)
提交回复
热议问题