【发布时间】:2012-07-10 16:51:34
【问题描述】:
我正在使用rand() 生成 0 或 1 (rand() % 2)。我正在使用当前时间播种 (srand(time(NULL)))。
经过多次调试,我意识到rand() 永远不会连续 16 次或更多次返回偶数(奇数)数。
这是一个已知问题吗?有没有 C 自带的更好的 PRNG?
我正在使用 Visual Studio 2010 在 Windows 7 上运行。
【问题讨论】:
-
rand never returns an even (odd) number 16 or more times in a row- 嗯...你测试了多少次?少于2^16次? -
连续获得16个赔率的概率为
(1/2)^16。这是相当低的...... -
大约十亿次,足以让 16 个偶数(奇数)大致出现 128 次(如果我的计算正确的话)。
-
在
rand的一些(旧)实现中,低位位的随机性低于高位位。试试(rand()>RAND_MAX/2?1:0) -
模数偏差可能是个问题。见stackoverflow.com/a/10984975/562769