【问题标题】:What's the difference between arc4random and arc4random_uniform? [duplicate]arc4random 和 arc4random_uniform 有什么区别? [复制]
【发布时间】:2015-04-29 22:39:27
【问题描述】:

我看过关于 Objective-C 中 randomarc4random 之间区别的旧帖子,我在网上看到过这个问题的答案,但我不太明白,所以我希望这里有人能解释一下以更容易理解的方式。

使用arc4randomarc4random_uniform生成随机数有什么区别?

【问题讨论】:

  • 意思是现成的文档所说的意思。您对文档有什么具体问题吗?
  • 这两个函数在Swift中的区别与(Objective-)C(++)中这两个函数的区别完全一样。无论您使用哪种语言调用它们,它们都是相同的函数,具有相同的行为。

标签: objective-c random arc4random


【解决方案1】:

arc4random 返回一个介于 0 和 (2^32)-1 之间的整数,而 arc4random_uniform 返回一个介于 0 和您传递的上限之间的整数。

来自man 3 arc4random

arc4random_uniform() 将返回一个小于upper_bound 的均匀分布的随机数。建议使用 arc4random_uniform() 而非 ``arc4random() % upper_bound'' 之类的结构,因为当上限不是 2 的幂时,它可以避免“模偏差”。

例如,如果你想要一个介于 0 和 4 之间的整数,你可以使用

arc4random() % 5

arc4random_uniform(5)

在这种情况下使用模运算符会引入模偏差,因此最好使用 arc4random_uniform。

要理解模偏差,假设 arc4random 的范围要小得多。不是 0 到 (2^32) -1,而是 0 到 (2^4) -1。如果您对该范围内的每个数字执行 % 5,您将得到四次 0,并且 1、2、3 和 4 各 3 次,使 0 更有可能发生。当范围更大时,这种差异会变得不那么显着,但最好避免使用模数。

【讨论】:

  • 是介于 0 和 5 之间,即 0、1、2、3、4、5 是可能的值,还是 0、1、2、3、4?从文档中,它说“小于”上限而不是“小于或等于”上限。
  • @VanDuTran 它不包括上限。所以 {0, 1, 2, 3, 4} 在您的示例中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2013-02-13
  • 2011-04-26
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多