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

本文关键字:选择 随机数 何确保 确保 | 更新日期: 2023-09-27 18:37:04

我正在用 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();
    }

问题是,当用户第二次玩游戏(通过单击"再次播放"按钮)并且再次执行上述代码时,它会继续选择相同的随机数,尽管它们不一定是相同的顺序。 这会导致每次都选择相同的琐事问题。每次执行上述代码时,我都想要一组全新的完全随机数。如何修改代码以完成此操作?

注意:我确实从堆栈溢出的其他地方复制了此代码,因此它不是我自己的原始代码。

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

假设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 毫秒左右更新一次。

我认为洗牌会比检查索引是否已被选中更好。

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

Random rand = new Random(newSeed);

例如,种子可以从当前时间获取

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