获得随机奇数或偶数的最有效方法是什么?

时间:2012-08-15 21:00:50

标签: objective-c

因此,我可以想到一些解决方案(例如关注获取随机奇数):

int n;
while (n == 0 || n % 2 == 0) {
    n = (arc4random() % 100);
}
真的..对吗?效率不高..

int n = arc4random() % 100);
if (n % 2 == 0) n += 1;

但我不喜欢它总是会增加数字,如果它不奇怪..也许这不应该?另一种方法可能是随机化:

int n = arc4random() % 100);
if (n % 2 == 0) {
    if (arc4random() % 2 == 0) {
       n += 1;
    else {
       n -= 1;
    }
 }

但这对我来说感觉有点尴尬..所以我想知道是否有更好的方法来做这类事情?

2 个答案:

答案 0 :(得分:6)

生成一个随机数,然后将其乘以2得到偶数,乘以2加1为奇数。

一般情况下,您希望保持这些简单,否则您将面临弄乱数字分布的风险。获取典型[0 ... 1)随机数生成器的输出,然后使用函数将其映射到所需范围。

FWIW - 除了第三个以外,看起来你并没有扭曲上面的发行版。请注意,除非您使用模数incl进行调整,否则获得99的可能性要小于其他所有其他项。负数。由于..

P(99) = P(first roll = 99) + P(first roll = 100 & second roll = -1) + P(first roll = 98 & second roll = +1)

P(first roll = 100) = 0

答案 1 :(得分:3)

如果你想要一组随机的二进制数字后跟一个固定的数字,那么我会选择按位运算:

 odd = arc4random() | 1; 
 even = arc4random() & ~ 1;