生成1到59之间的6个随机数的彩票程序



我创建了一个简单的程序,随机生成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();

基于Fisher-Yates洗牌,但节省了一些工作,因为我们知道我们不需要所有的值(如果我们只需要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)));

看到它在这里工作:

https://dotnetfiddle.net/NXYkpU

您可以使用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));
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
bool alreadyExist = false;
foreach (int item in lotto)
{
if (item == temp)
{
alreadyExist = true; 
break;
}
}
if (alreadyExist)
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);
}

相关内容

  • 没有找到相关文章

最新更新