11

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

C 中的这些随机数生成器中的哪一个可以产生更好的随机性:rand、random 或 arc4random?

注意:只是为了澄清问题,这不是关于真正随机性的问题,它只是这三个之间的冲突。


正如所指出的,这个问题没有多大意义,因为这不是关于 C 的,而是关于一个具体的实现,在我的例子中,可可(更具体地说是 iphone sdk,但我的猜测是它们与这些相同函数去)。尽管如此,这里还是有一些有用的信息。我以实现 arc4random 结束,主要是因为它易于使用(无需播种),这是没有人指出的一个重要因素。

我要结束这个问题,并为可可开发人员添加可可标签以查找有关 RNG 的信息。非常感谢那些做出贡献的人,并对造成的混乱感到抱歉。

4

2 回答 2

24

在这些函数中,只有 rand 是标准 C 的一部分。 random 是 POSIX 的一部分,而 arc4random 仅在 BSD(和派生)中提供。所以只有 rand 是“在 C 中”。

对于 rand,C 标准没有说明生成器的质量,即始终返回相同的数字是符合要求的。它表示该数字必须介于 0 和 RAND_MAX 之间。RAND_MAX 的值以及所使用的精确算法由实现定义(尽管 RAND_MAX 必须至少为 32767)。

对于随机数,POSIX规定它默认必须有至少 2^31 的周期,如果 initstate 以 256 字节的状态调用,那么它必须有至少 2^69 的周期;其他细节再次由实现定义。

对于 arc4random,具体实现是其定义(RC4)的一部分。它指定它给出 2^32 个不同的值;我找不到任何关于它的时期的信息。

要详细比较它们,您必须知道您指的是什么具体实现。

于 2008-11-30T15:38:01.610 回答
9

C 标准没有指定 rand() 的实现,但是大多数编译器使用线性同余生成器。random() 和 arc4random() 也不是标准 C,但它们比 rand() 的通常实现要好

我想说:arc4random() 比 random() 好比 rand()

rand() 真的很糟糕。但是,您可以轻松地比这三个都做得更好。

它还取决于您想要随机数的用途。一个好的加密/安全随机数生成器可能不是一个好的模拟随机数生成器,反之亦然。

于 2008-11-30T15:29:18.103 回答