rand()在OSX上是否会返回零?

时间:2015-03-30 00:07:17

标签: c macos random probability

我一直在运行这段代码差不多十个小时没有爱情:

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

我希望rand()最终滚动为零,从而触发断言。

我做错了什么或rand()永远不会返回零?

或者我没有等待足够长的时间才能看到它?我是2012年复古的2GHz i7。

3 个答案:

答案 0 :(得分:4)

如果this link是Mac OS X rand()的定义,则永远不会生成0。它不是一个非常好的伪随机数发生器,恕我直言。

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

答案 1 :(得分:2)

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

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

§7.22.2.2

  

无法保证产生的随机序列的质量,并且已知某些实现产生具有令人沮丧的非随机低阶位的序列。

答案 2 :(得分:0)

编辑:@rici说的话。

It looks like the FreeBSD rand never returns 0

该消息链有一个补丁,但它不包含在apple开源源中。

它应该最终返回零,但在我的计算机上,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%。

我不知道你的计算机需要多长时间才能拨打100亿次rand电话。