因此,我可以想到一些解决方案(例如关注获取随机奇数):
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;
}
}
但这对我来说感觉有点尴尬..所以我想知道是否有更好的方法来做这类事情?
答案 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;