Objective-C中的随机偶数?

时间:2014-06-27 05:04:43

标签: objective-c random

我知道:

randNum = arc4random_uniform(N);

将randNum设置为从0到N-1的随机数。

但是,如何修改上述语句以获得从0到N-1的随机偶数?

2 个答案:

答案 0 :(得分:1)

@ user3477950 给了您正确的答案。

虽然通常的做法是使用模数作为减少限制的方法,例如:randEvenNum = 2*(arc4random_uniform(N) % (N/2)),但这对任意模数都是不安全的,因为它会偏向随机数概率密度。因此,最好按 @ user3477950 建议,并使用该函数在一半空间内生成均匀分布,然后将幅度加倍(对概率密度没有影响的操作)< / p>

作为一个例子,假设您有一个生成均匀分布在0-5之间的生成器。你想要一个0-3包含的,所以你说,嘿,让mod 3 + 1,我们将有我们的发电机。这个问题是,如果你的发电机的密度对于所有0-5的数字是1/6,那么当你采用这个模数时,

  

{0,4} - &gt; 0

     

{1,5} - &gt; 1

     

{2} - &gt; 2

     

{3} - &gt; 3

概率密度不再平坦。我们有:

{1/6, 1/6, 1/6, 1/6, 1/6, 1/6}

我们现在有了

{1/3, 1/3, 1/6, 1/6}

当我们想要的是

{1/4, 1/4, 1/4, 1/4}

arc4random()函数是RSA生成的算法,并且熵非常高。更详细的结果需要分析。但是,假设该函数在0和N-1之间产生高度均匀的密度,那么您问题的最佳答案是:

randEvenNum = 2*arc4random_uniform(N/2);

答案 1 :(得分:1)

使用按位运算符更快,清除最低位,如@Gallymon所说。

unsigned int evenNumber = arc4random_uniform(N) & 0xFFFFFFFE ;