[英]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.