Arc4random上的数字限制是否会降低加载速度?

时间:2016-05-13 09:20:29

标签: swift arc4random

您好我在这里编程很新,我很好奇,如果更大的限制数生成器在生成随机数时导致它更慢?例如:

哪一个生成随机数更快?

arc4random_uniform(1000000)

arc4random_uniform(10)

速度可能相同吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

假设您正在讨论arc4random_uniform而不是arc4random,因为后者没有上限,您可以指定。

答案是:可能

查看source and documentation

  

通过生成新的随机数直到一个随机数来实现均匀性    返回超出范围[0, 2**32 % upper_bound)。这个    保证所选的随机数将在里面    [2**32 % upper_bound, 2**32)映射回[0,upper_bound]    在减少modulo upper_bound之后。

这意味着随机数生成的速度取决于arc4random的上限与上述模数余数之间的比率。

在你的例子中:

2^32 % 10 = 4
2^32 % 1000000 = 967.296

使用arc4random()一次创建随机数会产生例如768.649,小于第二个值。这意味着它必须创建第二个随机数,在后一种情况下第二次调用arc4random() - 第一个案例已经完成创建随机数。

但是运行时差异完全取决于机会。

第一次运行的程序可能在第一次尝试时产生1.316.166.055,导致两次调用都花费相同的时间。

由于arc4random均匀分布,第二个花费更长时间的概率有点接近967.296 / 2^32 0.00022521615 =>在~0.02%的呼叫中,第二个呼叫比第一个呼叫要长。

在这个计算中,我忽略了这样一个事实:理论上arc4random甚至可以产生一个小于4的数字,这个数字甚至可以触发第一次重新查询的调用。但它仍然应该让你了解差异是多么不可能。

如果你想得到可能"最慢"打电话你必须执行arc4random_uniform(2^31+1)arc4random的第一次通话有50%的失败率。