Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C rand()是否在OSX上返回过零?_C_Macos_Random_Probability - Fatal编程技术网

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

C rand()是否在OSX上返回过零?,c,macos,random,probability,C,Macos,Random,Probability,我在没有爱的情况下运行此代码将近十个小时: while ( true ) { int r = rand(); assert( r != 0 ); } 我希望rand()最终滚动一个零,从而触发断言 是我做错了什么,还是rand()从不返回零 还是我没有等足够长的时间来期待看到它?我现在使用的是2012年份2GHz i7。如果是Mac OS X的定义rand(),则永远不会生成0。这不是一个很好的伪随机数生成器,IMHO 在它的其他缺陷中,它的状态是以前返回的值,这意味着

我在没有爱的情况下运行此代码将近十个小时:

 while ( true ) {
     int r = rand();
     assert( r != 0 );
 }
我希望rand()最终滚动一个零,从而触发断言

是我做错了什么,还是rand()从不返回零

还是我没有等足够长的时间来期待看到它?我现在使用的是2012年份2GHz i7。

如果是Mac OS X的定义
rand()
,则永远不会生成0。这不是一个很好的伪随机数生成器,IMHO

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

编辑:@rici说的话

该消息链有一个补丁,但它没有包含在苹果开源软件中

它最终应该返回零,但在我的计算机上,
RAND_MAX
是2147483647

printf(“rand\u max=%d\r\n”,rand\u max)

Wolfram alpha无法计算出那么小的概率

运行以下示例:

prob x>0表示n=100000且p=0.00001的x二项式

prob x>0表示n=10000且p=0.0001的x二项式

prob x>0表示n=1000且p=0.001的x二项式

表明在概率为1/N的情况下,N次尝试似乎接近0.63

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

我不知道你的电脑打100亿个电话给兰德需要多长时间。
该标准要求对
rand
的连续调用形成一个序列,该序列是空间
[0;rand\u MAX]
的子集。它不要求所有可能的值都出现在任何可能的序列中

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

对于所产生的随机序列的质量没有保证,并且已知一些实现产生具有令人不安的非随机低阶位的序列


您没有使用种子(
srand
)初始化它。@chiliNUT:没有义务为随机数生成器设定种子。@chiliNUT
rand()
的行为就像在没有
srand()
的情况下调用了
srand(1)
。什么是
rand\u MAX()
?如果它很大,则需要很长时间。@chux:它不能大于INT_MAXI在讨论osx似乎使用的freebsd rand时发现,它说0永远不会返回:我可以通过10.6.8上手动反编译
libSystem.B.dylib
来确认这是
rand()
的实现。它很烂;使用
random()
,它在BSD上基于
arc4random
。或者,将我的PRNG用于非加密目的,Hmmm,因为它看起来像
srand(2088216195)-->rand()==0
定义使用弱种子1
srand(2147483647)-->rand()==0
否则。因此不清楚0将如何产生。(
RAND\u MAX==0x7FFFFFF
,32位int)@chux,我不认为
\define-USE\u-WEAK\u-seaking 1
是默认的构建选项。或者至少,当这个问题被问到时不是这样。@chux:是的,我想如果你选择调用
srand(RAND_MAX)
,你会得到一个零作为下一个“随机”数。但是你永远不会得到另一个,因为
if(*ctx==0)*ctx=123459876,我怀疑是否有很多人使用这种特殊的种子。如果不是为了那个测试,在那个种子之后,
rand
只会产生零。你做了一个不幸的没有根据的假设,
rand()
的输出是一个完全无偏的随机流。然而,Mac OS X使用的算法并不是完全无偏的,也不是非常随机的。@rici我是,我查看了你的链接,发现了一篇关于freebsd rand从不返回0的帖子,苹果文档的路径提到了它,所以我想…我不知道序列在哪里保证是一个循环。@rici:标准调用结果伪随机整数,根据定义,这些整数注定要循环,否则它们就不会有伪前缀。只要我们清楚循环没有限制长度(i.o.w.,这不是范围子集的简单排列),我同意,基于
srand
描述中的重复性要求。确实(不幸的是),甚至没有关于序列中可能值出现频率的指南。@rici很好,周期不能长于
pow(2,sizeof(unsigned)*CHAR_BIT)
,因此长度确实受到限制?内部状态可以比unsigned更宽。可能的序列数量受种子宽度的限制,但其循环长度仅受内部状态宽度的限制,而内部状态的宽度未指定。