rand() 是否曾经 return 在 OSX 上归零?

Does rand() ever return zero on OSX?

我已经运行这段代码快十个小时没有爱了:

 while ( true ) {
     int r = rand();
     assert( r != 0 );
 }

我预计 rand() 最终会返回一个零,从而触发断言。

我做错了什么还是 rand() 永远不会 return 为零?

或者我等待的时间还不够长?我使用的是 2012 年老式 2GHz i7。

如果this link是MacOSXrand()的定义,那么0永远不会产生。这不是一个很好的伪随机数生成器,恕我直言。

在它的其他缺陷中,它的状态是先前返回的值,这意味着它是一个从前一个值到下一个值的严格函数;它的循环不能大于它的范围,即[1, RAND_MAX-1]。 (它不能产生 0,因为 0 是算法中的定点。)

编辑:@rici 说的。

It looks like the FreeBSD rand never returns 0

该消息链有补丁,但苹果开源中没有。

它最终应该 return 为零,但在我的电脑上,RAND_MAX 是 2147483647

printf("rand_max = %d\r\n", RAND_MAX);

Wolfram alpha 无法计算这么小的概率。

运行 这些例子:

prob x>0 for x binomial with n=100000 and p=.00001

prob x>0 for x binomial with n=10000 and p=.0001

prob x>0 for x binomial with n=1000 and p=.001

表明在 1/N 的概率之后,N 次尝试似乎接近 0.63

看起来 5*N 次尝试应该可以让你超过 99%。

虽然我不知道你的计算机需要多长时间才能对 rand 进行 100 亿次调用。

标准要求对 rand 的连续调用形成一个序列,该序列是 space [0; RAND_MAX] 的子集。它不要求所有可能的值都出现在任何可能的序列中。

所以回答你的问题:你不能保证得到零;这取决于实现(从其他答案来看,BSD libc 的实现确实从来没有 return 0)。

§7.22.2.2

There are no guarantees as to the quality of the random sequence produced and some implementations are known to produce sequences with distressingly non-random low-order bits.