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

pat*_*ick 0 objective-c

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

int n;
while (n == 0 || n % 2 == 0) {
    n = (arc4random() % 100);
}
Run Code Online (Sandbox Code Playgroud)

哇..对吗?效率不高..

int n = arc4random() % 100);
if (n % 2 == 0) n += 1;
Run Code Online (Sandbox Code Playgroud)

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

int n = arc4random() % 100);
if (n % 2 == 0) {
    if (arc4random() % 2 == 0) {
       n += 1;
    else {
       n -= 1;
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

dfb*_*dfb 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)
Run Code Online (Sandbox Code Playgroud)

P(first roll = 100) = 0