如何确保不会每次在 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();
}
问题是,当用户第二次玩游戏(通过单击"再次播放"按钮)并且再次执行上述代码时,它会继续选择相同的随机数,尽管它们不一定是相同的顺序。 这会导致每次都选择相同的琐事问题。每次执行上述代码时,我都想要一组全新的完全随机数。如何修改代码以完成此操作?
注意:我确实从堆栈溢出的其他地方复制了此代码,因此它不是我自己的原始代码。
假设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()
。这将确保不是每次初始化一个新种子,数字将由一个种子创建的序列。这将使它们更接近真正的随机性。