Генерация случайных чисел - PullRequest
0 голосов
/ 29 января 2020

Может кто-нибудь объяснить эти две строки функции ??

 int getRandomNumber(int min, int max)
 {
    static const double fraction = 1.0 / (RAND_MAX + 1.0);
    return min + static_cast<int>((max - min + 1) * (rand() * fraction));
 }

1 Ответ

0 голосов
/ 30 января 2020

Похоже, это ограничивает rand () выход функции, чтобы попасть в мин и макс.

значение типа double fraction вычисляется из 1.0 / (RAND_MAX + 1.0);

RAND_MAX - это значение прекомпилятора, определенное в cstdlib или другом заголовочном файле или библиотеке, это большое положительное целое число, которое представляет крупнейший подписанный int ваша программа может использовать. Чем выше значение RAND_MAX, тем меньше fraction, поскольку 1 / число является обратной величиной; обратное значение 4 равно 1/4 или 0,25. 5 - это 1/5 или 0,20

1,0 должны неявно приводить RAND_MAX к числу с плавающей запятой, также известному как десятичное число; это гарантирует, что оператор / Division / не выполняет целочисленное деление (5/2 == 2; против 5.0 / 2.0 == 2.5)

return min + static_cast<int>((max - min + 1) * (rand() * fraction));

Возвращает целочисленное представление минимального / максимального спреда уменьшается случайным образом, добавляется к исходному минимуму. Эта строка использует значение параметра min в качестве «этажа». static_cast<int>() округляет значение с плавающей запятой ((max - min + 1) * (rand() * fraction)) до целого числа, то есть целого числа без десятичных частей. Это приведение важно для возврата значения типа int, но оно также гарантирует, что max не будет превышено округлением вниз.

(max - min + 1) - это разброс между параметрами max и min + 1. Так что, если max == min, вы будет умножать (rand () * дробь) на 1 вместо нуля.

rand() генерирует полуслучайное целое число (без десятичных частей) между 0 и RAND_MAX, поскольку fraction является обратной величиной RAND_MAX + 1, дробь всегда будет <1, и вывод rand () будет быть случайной частью минимального / максимального спреда. Ключевая часть понимания этой функции за пределами смешанной путаницы кода C и C ++ состоит в том, чтобы знать, что RAND_MAX используется переменной дроби И функцией rand (). Представьте, что часть <code>(rand() * fraction) - это часть расстояния от min

. Я бы попытался задать для этой функции несколько значений, каждый раз настраивая значения min, max и fraction, и вы увидите, как изменяется выходной сигнал. мог бы найти образец. Делая дробь меньше (1.0 / RAND_MAX + 1.0), вы можете кластеризовать возвращаемые значения ближе к минимуму. (посмотрите математический потолок и пол и комментарий грецкого ореха о равномерном распределении). Это можно сделать, чтобы сгладить вывод или сделать что-то более предсказуемым, или кластеризовать возвращаемые значения вокруг входного значения. Если математика является для вас непонятной частью, то возитесь с кодом и посмотрите, что произойдет, что, вероятно, поможет вашему пониманию и интуиции математических функций.

Добро пожаловать в Stack Overflow!

...