4
System.Random generator = new Random(DateTime.Now.Millisecond);
int[] lotteryNumber = new int[7];

Console.WriteLine("Your lottery numbers: ");
for (int i = 0; i<7; i++)
{
    lotteryNumber[i] = generator.Next(1, 37);
    Console.Write("{0} ",lotteryNumber[i]);
}
Console.ReadLine();

我需要制作一个打印 7 个彩票号码但没有重复号码的程序。上面的代码打印了 (1-37) 范围内的 7 个随机数,但重复了 appaer。我需要一种方法来防止出现重复的数字。

4

9 回答 9

12

IMO 最简单的方法是生成所有可能数字的序列(即 1-37),将集合打乱,然后取前七个结果。

在 Stack Overflow 上搜索“Fisher-Yates shuffle C#”会发现很多示例。

实际上,您可以修改 Fisher-Yates shuffle 以在获取结果时产生结果,因此您可以编写如下方法:

var numbers = Enumerable.Range(1, 37).Shuffle().Take(7).ToList();
于 2012-11-02T13:03:22.530 回答
1

您可以使用字典,但要确保防止重复键插入。字典的键将作为您需要的唯一数字

于 2012-11-02T13:06:36.923 回答
0

你可以把它们扔进一个HashSet<int>. 如果您Add和它返回 false,则生成一个新数字。

于 2012-11-02T13:03:02.333 回答
0

如果您试图从一个范围内选择没有重复的数字,您需要创建一个包含所有可能数字的数组,然后“洗牌”一个随机选择:

int[] allPossibleNumbers = Enumerable.Range(1, 37).ToArray();
int[] lotteryNumber = new int[7];
for (int i = 0; i < 7; i++)
{
    int index = r.Next(i, 37);
    lotteryNumber[i] = allPossibleNumbers[index];
    allPossibleNumbers[index] = allPossibleNumbers[i];
    // This step not necessary, but allows you to reuse allPossibleNumbers
    // rather than generating a fresh one every time.
    // allPossibleNumbers[i] = lotteryNumber[i];
}
于 2012-11-02T13:03:21.313 回答
0

生成包含 37 个项目的列表。然后在你的for中,选择一个并删除选中的

于 2012-11-02T13:04:16.293 回答
0

也许这可能会有所帮助,如果您获得现有号码,只需尝试找到不在数组中的新号码:

static void Main(string[] args)
        {
            System.Random generator = new Random(DateTime.Now.Millisecond); int[] lotteryNumber = new int[7];

            Console.WriteLine("Your lottery numbers: ");
            for (int i = 0; i < 7; i++)
            {
                int lNumber = 0;
                do
                {
                    lNumber = generator.Next(1, 37);
                }
                while (lotteryNumber.Contains(lNumber));
                lotteryNumber[i] = lNumber;

                Console.Write("{0} ", lotteryNumber[i]);
            }
            Console.ReadLine();
        }
于 2012-11-02T13:09:49.333 回答
0
HashSet<int> set = new HashSet<int>();
System.Random generator = new Random(DateTime.Now.Millisecond);

while(set.Count < 7){
    set.Add(generator.Next(1,37);
}

这应该可行,因为 HashSet 会自动忽略重复项。只需循环直到集合达到您需要的单位数量。唯一潜在的问题是它有可能(不太可能)循环很长时间,但它最终应该会响应。

于 2012-11-02T13:10:14.803 回答
0

所以我拿了你的原始代码......发现了一些逻辑错误并添加了你正在寻找的修复程序以防止随机数重复。

享受!

 System.Random generator = new Random(DateTime.Now.Millisecond);
            int[] lotteryNumber = new int[7];
            int lowerBounds = 1;
            int upperBounds = 8;
            int maxNumberLotteryValues = 7;

            if ( ( upperBounds - lowerBounds ) < (maxNumberLotteryValues))
            {
                Console.Write("Warning: Adjust your upper and lower bounds...there are not enough values to create a unique set of Lottery numbers! ");

            }
            else
            {
                Console.WriteLine("Your lottery numbers: ");
                for (int i = 0; i < maxNumberLotteryValues; i++)
                {
                    int nextNumber = generator.Next(lowerBounds, upperBounds);
                    int count = lowerBounds;  //Prevent infinite loop

                    while ((lotteryNumber.Contains(nextNumber))
                        && (count <= upperBounds))
                    {
                        nextNumber = generator.Next(lowerBounds, upperBounds);
                        count++;  //Prevent infinite loop
                    }

                    lotteryNumber[i] = nextNumber;
                    Console.Write("{0} ", lotteryNumber[i]);
                }
            }

            Console.ReadLine();
于 2012-11-02T13:54:15.143 回答
0
const int nBalls = 37;
const int nPicks = 6;
int[] balls = new int[nPicks];
Random rnd = new Random(DateTime.Now.Millisecond);

int remainingBalls=nBalls;
int remainingPicks=nPicks;
for (int i = 1; i <= nBalls; i++)
{
    if (rnd.Next(1, remainingBalls+1) <= remainingPicks)
        balls[--remainingPicks]=i;
    remainingBalls--;
}

Console.WriteLine(string.Join(",",balls));

随着 nPicks/nBalls 变大,将优于 Shuffle 和 HashSet 方法。

于 2017-11-05T13:18:34.390 回答