【发布时间】:2013-11-06 04:59:35
【问题描述】:
我正在模拟St Petersburg Paradox,当时我意识到我的掷硬币代码从未记录到连续超过 15 个正面的条纹。我运行了 100,000,000 次模拟,这应该会导致 平均 1526 条正面 16 长。
(0.5^16) x 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() 函数怎么会被如此有趣地破坏以产生这个问题?
【问题讨论】:
-
我在不同的机器上运行你的程序,我通常得到25、26、27左右的结果。
-
运行并收到 24、26、24。怀疑您的
rand()存在偏见。 -
跑了 4 次,得到了 25、26、23、28。你用的是什么平台和编译器?
-
RNG 的类型很多,有些比其他的更“随机”。
-
奇怪的是 RAND_MAX,根据定义必须至少为 32767。15 位 嗯。想知道 OP 会用 `if ((rand()%2) == 0)` 得到什么?
标签: c random coin-flipping