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
)。
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.
我已经运行这段代码快十个小时没有爱了:
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
)。
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.