避免随机重复

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(); 

我需要制作一个打印7个彩票号码的程序,但不需要重复。 上面的代码打印了(1-37)范围内的7个随机数,但重复了appaer。 我需要一种方法来防止出现重复的数字。

最简单的方法IMO将生成所有可能数字(即1-37)的序列,对集合进行洗牌,然后获取前七个结果。

在Stack Overflow上搜索“Fisher-Yates shuffle C#”会找到很多例子。

事实上,您可以修改Fisher-Yates shuffle以在获取结果时产生结果,因此您可以编写一个方法,例如:

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

您可以使用字典,但要确保防止重复键插入。 字典的键将作为您需要的唯一数字

你可以将它们扔进HashSet 。 如果您Add并返回false,则生成一个新数字。

如果你试图从一个范围中选择数字而不重复 ,你需要创建一个包含所有可能数字的数组,然后“随机”选择一个随机数:

 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]; } 

生成包含37个项目的列表。 然后在您的for中,选择一个并删除所选的

也许这可能会有所帮助,如果您获得现有数字,只需尝试找到不在数组中的新数字:

 static void Main(string[] 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); } 

这应该有效,因为HashSet会自动忽略重复项。 只需循环直到该集合达到您需要的单位数。 只有潜在的问题是它有潜在的(不太可能)循环很长一段时间,但它应该最终响应。

所以我拿了你的原始代码……发现了一些逻辑错误,并添加了你想要的修复,以防止随机数重复。

请享用!

  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)); 

随着nPicks / nBalls变大,将超越Shuffle和HashSet方法。