rand()
- это число от 0 до RAND_MAX
.
rand() % n
- это число от 0 до n - 1. Если вы хотите значение от 0 до n, вам нужно rand() % (n+1)
.
В вашем примере (MAX - MIN + 1)
- это span целочисленных значений для генерации, тогда как MIN
- это нижнее значение. Так, например, где:
MIN = -10
MAX = 10
span n
:
n = (MAX - MIN + 1) = 21
так что:
rand() % n
дает значения от 0 до 20 и
rand() % n - MIN
- от -10 до +10. Без +1 было бы неправильно от -10 до + 9.
Обратите внимание, что если требуется статистически высокое качество случайного числа, ограничение диапазона с использованием %
является ошибочным и приведет к смещению, когда n
не является фактором RAND_MAX + 1
. В этом случае (int)(n * ((double)rand() / (double)RAND_MAX))
является лучшим решением, поэтому вы должны иметь:
int randNumber = (int)((MAX - MIN) * ((double)rand() /
(double)RAND_MAX)) + MIN ;
Обратите внимание, что здесь нет +1, потому что диапазон (double)rand() / (double)RAND_MAX
составляет от 0 до 1, поэтому умножение на n дает от 0 до n включительно .