Arc4random 的更大数量限制是否会降低加载速度?
Does a larger number limit on Arc4random slows down loading speed?
嗨,我是这里编程的新手,我很好奇更大的极限数生成器是否会导致生成随机数时速度变慢?例如:
哪个生成随机数的速度更快?
arc4random_uniform(1000000)
或
arc4random_uniform(10)
难道速度一样吗?
谢谢!
假设您谈论的是 arc4random_uniform
而不是 arc4random
,因为后者没有您可以指定的上限。
答案是:可能!
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% 的失败几率。
嗨,我是这里编程的新手,我很好奇更大的极限数生成器是否会导致生成随机数时速度变慢?例如:
哪个生成随机数的速度更快?
arc4random_uniform(1000000)
或
arc4random_uniform(10)
难道速度一样吗?
谢谢!
假设您谈论的是 arc4random_uniform
而不是 arc4random
,因为后者没有您可以指定的上限。
答案是:可能!
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% 的失败几率。