两个范围之间的随机数

时间:2015-09-14 16:57:42

标签: ios objective-c

我正在尝试在Objective-C中的两个范围之间生成一个随机数。 例如,在[-50;-30][30,50]之间。

我在[-50,50]之间实现了这一目标,但我需要消除[-30,30]之间的所有值。

int rads = -50 + arc4random() % (50 - (-50));

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

以前一个答案为基础(已删除):

  1. 使用arc4random_uniform

  2. 使用正确的上限和正确的算术

  3. 关于1:arc4random_uniform(50)将产生介于0和49之间的数字。它将通过正确的unfirom分布产生该值。仅使用arc4random % something会引入模偏差。

    关于2:您正在尝试来检索 40个值但是42 ,因为您希望能够检索上限和下限值。如果我们简化边界,我们可以更好地看到错误,假设[-5;-3][3;5]:您希望数字-5,-4,-3,3,4,5六个值,而不是四个。

    <强>解决方案:

    int rads = arc4random_uniform(42) - 20; // values between -20 and 21 inclusive, 42 different numbers
    if (rads <= 0) { // subtract from the lower 21 values [-20;0]
        rads = rads - 30; // [-50;-30]
    } else { // add to the upper 21 values [1;21]
        rads = rads + 29; // [30;50]
    }
    
    对于上限和下限对称

    更一般

    int lower = 30;
    int upper = 50;
    int diff = upper - lower;
    int rads = arc4random_uniform((diff + 1) * 2) - diff; // values between -diff and (diff+1) inclusive, ((diff+1)*2) different numbers
    if (rads <= 0) { // subtract from the lower (diff+1) values [-diff;0]
        rads = rads - lower; // [-upper;-lower]
    } else { // add to the upper 21 values [1;diff+1]
        rads = rads + lower - 1; // [lower;upper]
    }
    

    注意您可以通过将条件减法移动到初始rads计算并更改后面的添加和添加条件来稍微简化代码。但这会使代码的可读性和内容性降低。

答案 1 :(得分:1)

尝试的一件事是随机选择1或-1。然后乘以30-50之间的另一个随机数就行了。