作者:和尚与尼姑离婚 | 来源:互联网 | 2023-05-17 11:55
我已经运行这个代码差不多十个小时没有爱情:while(true){intrrand();assert(r!0);}我希望rand()最终滚零,从而触发断言。我做错了什么或rand(
我已经运行这个代码差不多十个小时没有爱情:
while ( true ) { int r = rand(); assert( r != 0 ); }
我希望rand()最终滚零,从而触发断言。
我做错了什么或rand()永远不会返回零?
或者我没有等待足够长的时间来期待看到它? 我是2012年复古的2GHz i7。
如果此链接是Mac OS X rand()
的定义,则永远不会生成0。 它不是一个非常好的伪随机数发生器,恕我直言。
在其他缺陷中,其状态是先前返回的值,这意味着它是从先前值到下一个值的严格函数; 它的周期不能大于它的范围,即[1, RAND_MAX-1]
。 (它不能产生0,因为0是算法中的一个定点。)
该标准要求对rand
连续调用形成一个序列,该序列是空间的子集[0; RAND_MAX]
[0; RAND_MAX]
。 它不要求所有可能的值都出现在任何可能的序列中。
所以回答你的问题:你不能保证得到零; 这取决于实现(从其他答案来看,BSD libc的实现确实永远不会返回0
)。
§7.22.2.2
不能保证产生的随机序列的质量,并且已知一些实现产生具有令人沮丧的非随机低阶位的序列。
编辑:@rici说的话。
看起来FreeBSD rand永远不会返回0
该消息链有一个补丁,但它不包含在apple开源源中。
它应该最终返回零,但在我的计算机上, RAND_MAX
是2147483647
printf("rand_max = %drn", 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电话。
以上就是c/c++开发分享rand()在OSX上是否会返回零?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(编程笔记)。