繁体   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