C:关于rand,random和arc4random的确定真相

关于这个主题有很多相互矛盾的信息。 所以,让我们尝试就明确的答案达成一致:

C中这些随机数生成器中的哪一个创建了更好的随机性:rand,random或arc4random?

注意:只是为了使问题清楚,这不是关于真正随机性的问题,它只是那些3之间的冲突。


正如所指出的那样,这个问题没有多大意义,因为这不是关于C,而是关于一个特定的实现,在我的例子中,cocoa(更具体地说是iphone sdk,但我的猜测是它们是相同的,因为这些functiongo)。 不过,这里有一些有用的信息。 我通过实现arc4random得出结论,主要是因为它易于使用(不需要播种),这是一个没有人指出的重要因素。

我正在关闭这个问题,并为cocoa开发人员添加cocoa标记,以寻找有关RN​​G的信息。 非常感谢那些贡献的人,并为这种困惑感到抱歉。

在这些函数中,只有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()

兰德()非常可怕。 然而,你可以比三个人做得更好。

这也取决于你想要的随机数。 用于加密/安全性的良好随机数生成器可能不是用于模拟的良好随机数生成器,反之亦然。