簡體   English   中英

生成 1 到 59 C# 之間的 6 個隨機數的彩票程序

[英]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)));

看到它在這里工作:

https://dotnetfiddle.net/NXYkpU

您將需要添加 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM