您好我在这里编程很新,我很好奇,如果更大的限制数生成器在生成随机数时导致它更慢?例如:
哪一个生成随机数更快?
arc4random_uniform(1000000)
或
arc4random_uniform(10)
速度可能相同吗?
谢谢!
答案 0 :(得分:3)
假设您正在讨论arc4random_uniform
而不是arc4random
,因为后者没有上限,您可以指定。
答案是:可能!
通过生成新的随机数直到一个随机数来实现均匀性 返回超出范围
[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%的失败率。