サンクトペテルブルクのパラドックスのシミュレーションに取り組んでいたときに、コイン投げのコードが 15 回を超える表が連続して記録されていないことに気付きました。シミュレーションを 100,000,000 回実行した結果、平均 1526回の頭の長さ 16のストリークが発生するはずでした。
(0.5^16) × 100,000,000 = 1526
明らかに、何かが間違っています。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(int argc, char const *argv[])
{
srand(time(0));
int i, lim = 100000000, streak = 0, maxstreak = 0;
for (i = 0; i < lim; ++i)
{
if (rand()%2) {
streak++;
if (streak > maxstreak) maxstreak = streak;
}
else streak = 0;
}
printf("Ran %d times, longest streak of %d\n", lim, maxstreak);
return 0;
}
毎回以下を返します。
Ran 100000000 times, longest streak of 15
ご協力いただきありがとうございます!
編集: Windows 7 x64 で GCC バージョン 4.6.2 を実行しています。一般的なプログラミングには少し慣れていません。
編集 2: みんなの助けに感謝します! 誰かが固執しているのですが、現在の実装では 15 頭の制限があるのでしょうか? この問題を引き起こすために、どのようにしてrand()
関数がそれほど興味深いことに壊れているのでしょうか?