[英]Lottery program that generates 6 random numbers between 1 and 59 C#
我创建了一个简单的程序,它随机生成 6 个中奖号码。 当程序运行时,我还希望它确保相同的数字不会输出两次,以及在输出时将它们按数字顺序排序。 在坚持已经使用的类似技术的同时,我将如何做这样的事情? 我的代码在下面。 很感谢任何形式的帮助。
int temp;
int[] lotto = new int[6];
Random rand = new Random();
for (int i = 0; i < 6; i++)
{
temp = rand.Next(1, 59);
lotto[i] = temp;
}
Console.Write($"The lotterry winning numbers are: ");
for (int i = 0; i < 6; i++)
{
Console.Write(lotto[i] + " ");
}
Console.ReadKey();
您可以使用 Linq 创建序列 [1..59] 并随机排序以对其进行洗牌。
Random rand = new Random();
var winners = Enumerable.Range(1, 59)
.OrderBy(x => rand.Next())
.Take(6)
.OrderBy(x => x)
.ToList();
Console.WriteLine(String.Join(" ", winners));
基于 Fisher-Yates shuffle,但节省了一些工作,因为我们知道我们不需要所有值(如果我们只需要 1000 万个势中的 6 个值,我们只需要进行 Fisher-Yates 的前六次迭代算法)。
public IEnumerable<int> DrawNumbers(int count, int MaxNumbers)
{
var r = new Random(); //ideally, make this a static member somewhere
var possibles = Enumerable.Range(1, MaxNumbers).ToList();
for (int i = 0; i < count; i++)
{
var index = r.Next(i, MaxNumbers);
yield return possibles[index];
possibles[index] = possibles[i];
}
}
var lottoNumbers = DrawNumbers(6, 59);
Console.Write("The lotterry winning numbers are: ");
Console.WriteLine(string.Join(" ", lottoNumbers.OrderBy(n => n)));
看到它在这里工作:
您将需要添加 import 语句和一些更改
使用 System.Linq;
int temp;
int[] lotto = new int[6];
Random rand = new Random();
int i = 0;
while(i < 6)
{
temp = rand.Next(1, 59);
//check if lotto contains just generated number, if so skip that number
if (lotto.Contains(temp))
continue;
lotto[i] = temp;
i++;
}
Console.Write($"The lotterry winning numbers are: ");
// Sort array in ascending order.
Array.Sort(lotto);
for (int j = 0; j < 6; j++)
{
Console.Write(lotto[j] + " ");
}
Console.ReadKey();
我可能会按照 Dmitri 的方式来做,因为它快速而明显,而且对于这种大小的数组,性能并不那么重要。
但只是为了好玩,这稍微更有效率。
IEnumerable<int> GetNumbers(int min, int max, int count)
{
var random = new Random();
var size = max - min + 1;
var numbers = Enumerable.Range(min, size).ToArray();
while (count > 0)
{
size--;
var index = random.Next(0, size);
yield return numbers[index];
numbers[index] = numbers[size];
count--;
}
}
此解决方案创建一个包含所有可能值的数组并随机选择它们。 每次进行选择时,都会通过移动最后一个元素来替换所选元素来“缩小”数组,从而防止重复。
使用:
var numbers = GetNumbers(1, 59, 6).ToList();
foreach (var number in numbers.OrderBy(x => x))
{
Console.WriteLine(number);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.