gpt4 book ai didi

投币模拟从未超过 15 次正面朝上

转载 作者:太空狗 更新时间:2023-10-29 17:08:47 26 4
gpt4 key购买 nike

我正在模拟 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() 函数是如何被如此有趣地破坏以产生这个问题的?

最佳答案

尝试为您的随机数生成器选择不同的种子值。虽然 rand() 是一个非常好的随机数生成器,但它实际上是一个伪随机数生成器。您可能想阅读 rand (man -s3 rand) 的手册页,其中明确指出您应该(对于某些实现)使用高阶位而不是低阶位...

NOTES
The versions of rand() and srand() in the Linux C Library use the same
random number generator as random(3) and srandom(3), so the lower-order
bits should be as random as the higher-order bits. However, on older
rand() implementations, and on current implementations on different
systems, the lower-order bits are much less random than the higher-
order bits. Do not use this function in applications intended to be
portable when good randomness is needed. (Use random(3) instead.)

在不了解您运行程序的系统的更多信息的情况下,我们无法知道这是否是您的问题。但是请尝试更改您的代码以使用不同于 2^0 位的位。

运行你的版本对我有用,

/coinflipsim 
Ran 100000000 times
head 50006650, streak 27
tail 49993350, streak 25

这是适合我的代码,使用与位 0 不同的位,

int main(int argc, char const *argv[])
{
srand(time(0));

int i, lim = 100000000;
int head=0, tail=0;
int hstreak=0, tstreak=0;
int hstreakmax=0, tstreakmax=0;
for (i = 0; i < lim; ++i)
{
//if (rand()%2)
if( rand() & (1<<13) ) //pick a bit, try different bits
{
head++;
if( ++hstreak>hstreakmax) hstreakmax=hstreak;
tstreak=0;
}
else {
tail++;
if( ++tstreak>tstreakmax) tstreakmax=tstreak;
hstreak=0;
}
}
printf("Ran %d times\n",lim);
printf("head %d, streak %d\n",head,hstreakmax);
printf("tail %d, streak %d\n",tail,tstreakmax);
return 0;
}

将 rand()%2 行更改为此并重新运行,

        if( rand() & (1<<13) ) //pick a bit, try different bits

不同的结果,

./coinflipsim 
Ran 100000000 times
head 50001852, streak 25
tail 49998148, streak 28

关于投币模拟从未超过 15 次正面朝上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19804460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com