Arc4random 的更大数量限制是否会降低加载速度?

Does a larger number limit on Arc4random slows down loading speed?

嗨,我是这里编程的新手,我很好奇更大的极限数生成器是否会导致生成随机数时速度变慢?例如:

哪个生成随机数的速度更快?

arc4random_uniform(1000000)

arc4random_uniform(10)

难道速度一样吗?

谢谢!

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

答案是:可能


查看 source and documentation:

Uniformity is achieved by generating new random numbers until the one returned is outside the range [0, 2**32 % upper_bound). This guarantees the selected random number will be inside [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound) after reduction 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 的数字,这甚至会触发第一次调用重新查询)。但它仍然应该让您了解差异的可能性有多大。

如果您想获得可能的 "slowest" 调用,您必须执行 arc4random_uniform(2^31+1),这在第一次调用 arc4random 时有大约 50% 的失败几率。