2015-09-14 3 views
0

Я пытаюсь создать случайное число между двумя диапазонами в Objective-C. Например, между [-50;-30] и [30,50].Случайное число между двумя диапазонами

Я достиг этого между [-50,50], но мне нужно устранить все значения между [-30,30].

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

Благодарим за помощь.

+0

Можете ли вы придерживаться этого цикла? 'while (rads> -30 || rads <30) rads = ...' – gh0st

+0

о том, чтобы решить два randoms, один между -30 и -50 и один между 30 и 50 –

+4

Существует 40 возможных значений, поэтому просто получить случайное значение от 0 до 40, и если случайный <20 до - 50, если он не делает + 10. – Astrogat

ответ

3

Чтобы построить на предыдущий ответ (который был удален):

  1. использование arc4random_uniform

  2. использование правильной оценки сверху и правильные арифметика

В отношении 1: arc4random_uniform(50) будет введите число от 0 до 49 включительно. Это даст это значение при правильном распределении некромов. Использование только arc4random % something вводит смещение по модулю.

Что касается 2: Вы пытаетесь не получить 40 значений, но 42, так как вы хотите, чтобы иметь возможность получить верхнюю нную нижнюю границу значений, а также. Если мы упрощаем границы мы можем увидеть ошибки лучше, предположим [-5;-3] и [3;5]: вы хотите, число -5,-4,-3,3,4,5 шесть значений, а не 4.

Решение:

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. Тогда умножение этого на другое случайное число между 30-50 будет работать.

+0

Это не решение! Предоставьте некоторый код, если у вас есть вопрос, напишите комментарий, если у вас нет репутации, попробуйте дать правильные ответы до тех пор. – luk2302

+0

Предлагает процедуру, которая решает проблему, @ luk2302. Код не является требованием для ответа, хотя часто бывает лучше. –

+0

@JoshCaswell Я согласен - но он по-прежнему очень низкое качество, так как предлагаемый ответ не будет даже близок к тому, что хочет OP, он создаст раздутую распределенную случайную переменную от -50 до +50. Возможно, я должен был поставить этот аргумент в первый комментарий уже ... – luk2302

Смежные вопросы