Чтобы построить на предыдущий ответ (который был удален):
использование arc4random_uniform
использование правильной оценки сверху и правильные арифметика
В отношении 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
и изменив позднее добавление и условие для добавления. НО это сделает код немного менее читабельным и интуитивным.
Можете ли вы придерживаться этого цикла? 'while (rads> -30 || rads <30) rads = ...' – gh0st
о том, чтобы решить два randoms, один между -30 и -50 и один между 30 и 50 –
Существует 40 возможных значений, поэтому просто получить случайное значение от 0 до 40, и если случайный <20 до - 50, если он не делает + 10. – Astrogat