2016-05-09 7 views
2

乱数の履歴が将来の結果を予測するのに役立つかどうかをテストする際に、生成された数の平均と正しい推測の数との間に、予期しない強い相関があることがわかりました。なぜ乱数と正しい推測値との間に強い相関関係がありますか?

このテストでは、コイン(頭= 0、尾= 1)の反転をシミュレートし、前の試行が頭の方に偏っていれば尻尾を推測し、逆も同様です。

なぜ生成された数字の合計が、次のLinqPadプログラムの正しい推測数とほぼ等しいのですか?

void Main() 
{ 
    var rnd = new Random(); 
    var attempts = 10000000; 
    var correctGuesses = 0; 
    long sum = 0; 
    decimal avg = 0.5m; 

    for (int i = 0; i < attempts; i++) 
    { 
    var guess = avg < 0.5m ? 1 : 0; 
    var result = rnd.Next(0, 2); 
    if (guess == result) 
    { 
     correctGuesses += 1; 
    } 
    sum += result; 
    avg = (decimal)sum/(decimal)attempts; 
    } 

    attempts.Dump("Attempts");  
    correctGuesses.Dump("Correct Guesses"); 

    avg = (decimal)sum/(decimal)attempts; 
    avg.Dump("Random Number Average"); 
} 

は、コード内のエラーをしたことがありますか?これは自然な関係ですか?私は試行回数を増やすと平均が0.5に収束すると予想していました。これはかなり均等に分布しています。これをへの10億コールでテストしましたが、生成された数字の合計が正しい推測の数に相関するとは思わなかった。

+0

あなたのコードをあまり詳しく読まないと、 'Random'クラスが擬似乱数ジェネレーターであることが分かりますか?のように、あまりランダムではない?実際の乱数が必要な場合は、 'Random'クラスよりはるかに強く(遅く)する必要があります。 – Jamiec

+0

このように考えてください。あなたはコインを10回ひっくり返し、10回すべてが頭に着地した。 11回目にコインを裏返すと、それは再びヘッズに上陸する確率はいくらですか? – user1666620

+0

@Jamiec:はい、私はそれを認識しています。それは私の元のテストに影響を与えるかもしれませんが、まだ相関を説明していません:-) –

答えて

4

あなたのエラーは、この行である:

avg = (decimal)sum/(decimal)attempts; 

は試みによって(その時点までにI上ベース)の合計を分割する意味がありません。意味のあるものをあなたに与えるために、代わりにi(EDIT:より正確にはi + 1)で割ります。

+1

それはチケットです...私がそれを逃したとは信じられませんが、それは私がコピーして貼り付けるために得るものです。私は 'i + 1'を使用していますが、今は期待どおりに動作します。 –

+0

ありがとうございます、私の答えを受け入れることができますか? –

+1

完了...時間制限がアップするまで待たなければならなかった;-) –

-3

ランダムなクラスは、シードなしで現在の時間をシードとして使用して乱数を生成します。つまり、サイクル内のrnd.Nextメソッドの呼び出しによって、どのくらい速くあなたのマシンはサイクルを経ます。

+0

私はそうは思わない。 OPは同じインスタンスを使用しているので、うまくいくはずです。 – Jonesopolis

+2

それは私がそうでない私が各反復のための新しいランダム()を作成した場合、結果にのみ影響します。 –

関連する問題