Подтвердить что ты не робот

Почему все случайные числа, генерируемые между низкими() и max() равными бесконечности?

Почему u в программе ниже всегда бесконечность?

#include <random>
#include <limits>

int main()
{
    auto seed = std::random_device()();
    std::mt19937 randomEngine(seed);
    const double lo = std::numeric_limits<double>::lowest(); // ~= -1.8e+308
    const double hi = std::numeric_limits<double>::max(); // ~= 1.8e+308
    std::uniform_real_distribution<> U(lo, hi);
    double u = U(randomEngine); // always 1.#INF000000000000
    return 0;
}

Это явно связано с диапазоном, переданным в std::uniform_real_distribution. Если передать его (lo,0) или (0,hi), он порождает конечные случайные числа, но почему?

4b9b3361

Ответ 1

Согласно N3797:

26.5.8.2.2 [rand.dist.uni.real]

2 Требуется: a ≤ b и b − a ≤ numeric_limits<RealType>::max().

Это условие не выполняется, поскольку b - a есть 2 * numeric_limits<double>::max().