0

因此,在我的脑海中,我可以想到一些解决方案(例如,专注于获取随机奇数):

int n;
while (n == 0 || n % 2 == 0) {
    n = (arc4random() % 100);
}

eww..对吗?一点效率都没有。。

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;
    }
 }

但这对我来说感觉有点糟糕。所以我想知道是否有更好的方法来做这种事情?

4

2 回答 2

6

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

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

FWIW - 除了第三个之外,您看起来并没有扭曲上面的分布。请注意,除非您使用模数(包括)进行调整,否则获得 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

于 2012-08-15T21:03:12.160 回答
3

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

 odd = arc4random() | 1; 
 even = arc4random() & ~ 1;  
于 2012-08-15T21:07:46.313 回答