我正在用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上的其他地方复制了这段代码,所以这不是我自己的原始代码。
答案 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()
。这将确保每次都不是初始化新种子,数字将是由一个种子创建的序列。这将使他们更接近真正的随机性。