Похоже, это ограничивает 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!