【问题标题】:C: the definitive truth about rand, random and arc4random [closed]C:关于 rand、random 和 arc4random 的最终真相 [关闭]
【发布时间】:2010-09-24 15:27:33
【问题描述】:

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

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

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


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

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

【问题讨论】:

  • PRNG 的 drand48() 系列怎么样?我的评估是“不在标准 C 中”,这是 POSIX / SUS 的一部分;通常比兰特好;可能不如 random() 及其支持功能。
  • 这个问题没有意义。只有 rand() 是 C 语言的一部分,标准没有说明它应该有多随机或应该如何实现。
  • 是的,显然我搞砸了。它的范围应该缩小到可可。所以现在怎么办?改变问题的范围会使答案变得尴尬。但是这里有对可可开发者有用的信息,关闭这个问题会让它陷入困境。怎么办?

标签: c cocoa random


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 嗨,马丁,在我的例子中,实现是 iphone SDK。这个问题真的很重要吗?我应该编辑吗?如果我能避免改变问题的范围,我会更好。
  • 如果 iphone SDK 类似于 OSX,那么 rand() 实现来自 FreeBSD (rand.c 1.15)。然后该算法来自 Parker 和 Miller,“随机数生成器:很难找到好的”。如果 initstate 的 n
  • arc4random 算法在所有实现中都相同吗?我在这里读到它是可可中最好的:iphonedevelopment.blogspot.com/2008/10/…。在大多数实现中,它与其他两个相比如何?也许我们可以达成一些共识。
  • 我认为这篇博客文章被误导了。它声称因为 arc4random 产生 32 位而不是 31 位,所以它提供了“更高的精度”——但实际上,它只提供了一个额外的位。在典型的应用程序中,您甚至不需要每次调用 31 位,但要少得多。 rand 和 arc4random 都不错。
  • @StephThirion @Martinv.Löwis 我认为在这一点上值得注意的是,Apple 的 rand(3) 手册页打开时完全废弃了 rand 以支持 arc4randomrandom(3) 的手册页得出结论,需要加密安全随机性的应用程序应该改用 arc4random
【解决方案2】:

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

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

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

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

【讨论】:

  • “我想说...”。你能解释一下原因吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多