关于这个主题有很多相互矛盾的信息.因此,让我们尝试就明确的答案达成一致:
C中这些随机数生成器中的哪一个创建了更好的随机性:rand,random或arc4random?
注意:只是为了使问题清楚,这不是关于真正随机性的问题,它只是那些3之间的冲突.
正如所指出的,这个问题没有多大意义,因为这不是关于C,而是关于一个特定的实现,在我的例子中,cocoa(更具体地说是iphone sdk,但我的猜测是它们是相同的,因为这些功能去).不过,这里有一些有用的信息.我通过实现arc4random得出结论,主要是因为它易于使用(不需要播种),这是一个没有人指出的重要因素.
我正在关闭这个问题,并为可可开发人员添加可可标记,以寻找有关RNG的信息.非常感谢那些贡献的人,并为这种困惑感到抱歉.
在这些函数中,只有rand是标准C的一部分.random是POSIX的一部分,arc4random仅在BSD(和派生)中提供.所以只有兰特是"在C".
对于兰特来说,C标准没有说明发电机的质量,即返回总是相同的数字符合要求.它表示该数字必须介于0和RAND_MAX之间.RAND_MAX的值和所使用的精确算法是实现定义的(尽管RAND_MAX必须至少为32767).
对于随机,POSIX 指定默认情况下它必须具有至少2 ^ 31的周期,并且如果使用256字节状态调用initstate,则它必须具有至少2 ^ 69的周期; 其他细节再次由实现定义.
对于arc4random,具体实现是其定义的一部分(RC4).它指定它给出2 ^ 32个不同的值; 我找不到关于它的时期的任何事情.
要详细比较它们,必须知道您所引用的具体实现.
R标准的实现没有由C标准指定,但是大多数编译器使用线性同余生成器.random()和arc4random()也不是标准C,但它们比rand()的通常实现更好
我会说:arc4random()优于random()优于rand()
兰德()非常可怕.然而,你可以比三个人做得更好.
这也取决于你想要的随机数.用于加密/安全性的良好随机数生成器可能不是用于模拟的良好随机数生成器,反之亦然.