Что означает rand ()% range + lower? [закрыто]

Dec 18 2020

Я изучаю C прямо сейчас, и я не понимаю, что rand() % range + lowerозначает эта строка кода.

printf("I will generate 10 random numbers between %d and %d . . .\n", lower, upper);

int range = upper - lower+1;                        
for(int i = 0; i <= 10; i++) {                      
    int number = rand() % range + lower;            
    printf("%d\t", number);

Ответы

SergeBallesta Dec 18 2020 at 18:24

Это линейный генератор случайных чисел для бедняков.

Это действительно случайное значение, потому что оно передается, из rand()которого возвращается случайное целое число, и по конструкции значение имеет значение> = нижний и <= верхний.

Но это все еще инструмент для бедняков, потому что значения в [нижнем, верхнем] интервале могут иметь разные вероятности.

Короче говоря, его можно использовать, если вам просто нужны случайные значения, но не должно быть, если вам нужен криптографический безопасный случайный источник.

JhnW Dec 18 2020 at 18:32

Прочтите, пожалуйста, около оператора%. Это деление по модулю. Деление по модулю - хороший инструмент для равномерного сопоставления самого большого диапазона с самым коротким диапазоном (в вашем случае rand ()% range ). Вам просто нужно добавить начало диапазона, чтобы переместить все значения в правильные позиции. Код rand ()% range + lower - это стандартная идиома C для получения случайных чисел из диапазона A, B. Вы можете найти больше идиом, например для чисел с плавающей запятой с диапазоном (A, B) или диапазоном <A, B>.