arc4random和arc4random_uniform有什么区别?

52

我看到关于Objective-C中randomarc4random之间差异的旧帖子,也在网上看到了答案,但我没能真正理解,所以希望这里有人能用更易懂的方式来解释一下。

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


它的意思是文档中所写的意思。你对文档有具体的问题吗? - Hot Licks
1
在Swift中,这两个函数之间的区别与(Objective-)C(++)中这两个函数之间的区别完全相同。无论从哪种语言调用它们,它们都是相同的函数,具有相同的行为。 - rickster
1个回答

111

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,则会出现4次0,以及3次1、2、3和4,从而使0更有可能出现。当范围大得多时,这种差异变得不那么显着,但最好避免使用模数。


1
它是在0和5之间吗,即可能的值为0、1、2、3、4、5,还是只有0、1、2、3、4?从文档中可以看到,它说的是“小于”上限而不是“小于或等于”上限。 - Van Du Tran
3
@VanDuTran提到它不包括上限。因此,你的例子中应该是{0, 1, 2, 3, 4}。 - JaredH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接