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