如何确保每次在C#中都不会选择相同的随机数?

时间:2015-01-11 23:21:10

标签: c# random

我正在用C#编写一个琐事游戏玩家应用程序,用户必须从一组20个可用问题中挑选5个随机选择的琐事问题。

我使用此代码生成应用程序将用于获取问题的索引:

    private void GenerateRandomNumbers(int RandomIndex)
    {
        Random rand = new Random();
        HashSet<int> check = new HashSet<int>();
        for (int i = 1; i < RandomIndex; i++)
        {
            int curValue = rand.Next(1, RandomIndex);
            while (check.Contains(curValue))
            {
                curValue = rand.Next(1, RandomIndex);
            }
            ChosenQuestions.Add(Questions[curValue]);

            check.Add(curValue);
        }
        check.Clear();
    }

问题在于,当用户第二次玩游戏时(通过点击“再次播放”按钮)并再次执行上述代码,它会继续选择相同的随机数,尽管它们不一定相同订购。这导致每次都选择相同的琐事问题。每次上面的代码执行时,我想要一组全新的完全随机数。如何修改代码来完成此任务?

注意:我确实从Stack Overflow上的其他地方复制了这段代码,所以这不是我自己的原始代码。

3 个答案:

答案 0 :(得分:1)

假设RandomIndex是要选择的值的数量。你想要这个:

rand.Next(1, RandomIndex);

rand.Next(0, Questions.Length);

循环中也有一个错误。让我们解决整个问题:

private void GenerateRandomNumbers(int RandomIndex)
{
    Random rand = new Random();
    HashSet<int> check = new HashSet<int>();
    for (int i = 0; i < RandomIndex; i++)
    {
        int curValue = rand.Next(0, Questions.Length);
        while (check.Contains(curValue))
        {
            curValue = rand.Next(0, Questions.Length);
        }
        ChosenQuestions.Add(Questions[curValue]);
        check.Add(curValue);
    }
}

此外,如果您在紧密循环中调用它,您将获得重复拾取的相同值。这是因为Random根据系统时钟选择一个种子,它只会每15 ms左右更新一次。

我认为shuffle是更好的方法,而不是检查索引是否已被选中。

答案 1 :(得分:-2)

你可以用不同的种子种子RNG

Random rand = new Random(newSeed);

种子可以从当前时间开始,例如

答案 2 :(得分:-2)

尝试仅使用一个全局Random对象,而不是每次用户播放时都不创建new Random()。这将确保每次都不是初始化新种子,数字将是由一个种子创建的序列。这将使他们更接近真正的随机性。