Как rand в C принимает отрицательные значения в интервале?
Как понять смысл конструкции
rand() % 21 + (-10)
Не понятно значение (-10), т.е. здесь значение интервала до 21, но почему -10 указана в скобках и работает ли rand с отрицательными числами в интервале?
Ответы (3 шт):
Первая часть даёт диапазон случайных чисел 0..20, а вычитание десятки переводит его в диапазон -10..10
функция rand() выдаёт значение от 0 до 2^15 - 1 (32767)
rand() % 21
вычисляет остаток от деления полученного случайного числа на 21 (т.е. от 0 до 20).
поскольку остатки цикличны таким образом реализуется генерация случайного числа от 0 до 20 включительно
+ (-10)
смещает случайное число влево на 10, т.е. вместо случайного числа в диапазоне 0..20 получается случайное число в диапазоне -10..10
P.S.
если бы требовалось не целочисленное значение, а действительное, то можно было бы сделать так:
float value = -10.0f + 20 * float(rand()) / 32767.0
P.S.
на счет 32767 я уже помню слабо, вроде можно было бы использовать константу RND_MAX или что-то такое