Если 5 + rand() % 6
генерирует случайное число от 5 до 10, как бы я сгенерировал десятичное число? Я попытался присвоить переменную с плавающей точкой ((4 + rand() % 8) / 100)
, но это ничего не делает, кроме как присвоить переменной ноль.
Лично я бы пошел с чем-то более надежным, чем rand()
(но это может быть потому, что я занимаюсь исследованиями в областях, где требуются высококачественные случайные числа):
#include <random>
double randomDouble(double bottom, double top) {
std::uniform_real_distribution<double> dist(bottom, top);
std::mt19937 gen; // Mersenne Twister PRNG
return dist(gen);
}
Эта маленькая функция использует Мерсенн Твистер, распространенный тип PRNG, у которого период (число случайных чисел перед повторением) равен 2 ^ 19937 — отсюда и название. Теперь просто назовите это так:
double foo = randomDouble(0.04, 0.11);
Есть два основных способа преобразования генератора чисел rand()
который производит числа в [0, RAND_MAX]
диапазон, чтобы заставить его производить числа в диапазоне [a, b]
:
n = rand() % (b - a + 1) + a;
n = rand() * (b - a + 1) / (RAND_MAX + 1) + a;
Второй метод применим к диапазонам с нецелым числом a
а также b
,
Имейте в виду, что, помимо уже упомянутых проблем качества случайных чисел, этот генератор может не обеспечивать достаточно плотного охвата целевого диапазона. Чем больше значение RAND_MAX
Чем плотнее покрытие.