私はまだ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) が生成されるという考え方です。実際には、10 回のうち 9 回は、最初に 1 つの数値を生成し、その数値をループの残りの実行に使用します。
誰もが時々、結果が約 50/50 (統計的に期待されるもの) になることがありますが、通常は同じ結果が 25 回繰り返されます。
ループ内でフリップ変数を宣言していることに注意してください。ループ内とループの直前に前後に移動しましたが、変更は効果がないようです。
私は何か間違ったことをしていますか、それとも C# は統計的な異常を捨てるのが好きですか?