【发布时间】:2013-10-22 14:57:26
【问题描述】:
我还是 C# 新手,我正在尝试构建一个模拟掷硬币 X 次的短程序:
// Declarations
int headCount = 0;
int tailCount = 0;
// Main Program Logic
Console.WriteLine("Press enter to begin");
Console.ReadLine();
for (int x = 1; x <= 25; x++)
{
Random rnd = new Random();
int flip = rnd.Next(1, 3);
if (flip == 1)
{
Console.WriteLine("Heads");
headCount++;
}
else
{
Console.WriteLine("Tails");
tailCount++;
}
}
Console.WriteLine("Heads came up {0} times.", headCount);
Console.WriteLine("Tails came up {0} times.", tailCount);
if (headCount > tailCount)
{
Console.WriteLine("Heads wins.");
}
else
{
Console.WriteLine("Tails wins.");
}
// END OF DOCUMENT
Console.ReadLine();
}
现在,我确信我的代码是可靠的,但是,当我运行程序时遇到了问题。在上面的代码中,想法是每次执行 for 循环时都会生成一个新的随机数(1 或 2)。实际上,十分之九,它第一次生成一个数字,然后将该数字用于循环的其余执行。
每个人偶尔一次,结果大约是 50/50(您在统计上所期望的),但通常它只是重复 25 次的相同结果。
请注意,我在循环内声明了翻转变量。我已经在循环中和循环之前来回移动它,并且更改似乎没有任何效果。
是我做错了什么还是 C# 喜欢抛出统计异常?
【问题讨论】:
-
每个人都给出了正确答案,这里有一些关于随机数的额外阅读:msdn.microsoft.com/en-us/library/…
-
如果您需要更好的随机性,请考虑使用 RNGCryptoServiceProvider,如下所述。
-
解决问题的最快方法是在循环中使用之前生成大量随机数。然后生成一个随机数组 start_index 数字(如果您打算使用从 0 索引开始的数组,则不生成)。当程序进入循环时,使用 start_index 数字从数组中获取第一个生成的随机数。然后在每个循环迭代中获取 (index+x)。还要检查并重置 start_index,如果它到达带有随机数的数组的末尾。