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

Uniform_real_distribution не является равномерным

Пожалуйста, помогите мне понять это. После запуска фрагмента:

random_device randomEngine;
mt19937 generatorEngine(randomEngine());
uniform_real_distribution<double> unifRandomValue(
                                       numeric_limits<double>::min(), 
                                       numeric_limits<double>::max());

double test[1000];
for (int i{ 0 }; i < 1000; ++i) {
    test[i] = unifRandomValue(generatorEngine);
}

Почему каждое генерируемое значение в диапазоне [1.0E306, 1.8E308]? Я ожидал, что случайное значение равномерно распределено от почти 0 до максимального двойного типа.

Спасибо заранее!


Вот более полный пример:

const size_t size{ 1000 };
std::random_device randomEngine;
std::mt19937 generatorEngine(randomEngine());
std::uniform_real_distribution<double> unifRandomValue(
                                std::numeric_limits<double>::min(), 
                                std::numeric_limits<double>::max());

std::array<double, size> test;
for (int i{ 0 }; i < size; ++i) {
    test[i] = unifRandomValue(generatorEngine);
}

auto minMaxIt = std::minmax_element(test.begin(), test.end());

// average without overflow
double average{ 0.0 };
for (int i{ 0 }; i < size; ++i) {
    average += test[i] / size;
}

std::cout << "min value : " << *minMaxIt.first << std::endl;
std::cout << "max value : " << *minMaxIt.second << std::endl;
std::cout << "average   : " << average << endl;

// one possible output (they are all similar)
//  min value : 1.73361e+305
//  max value : 1.79661e+308
//  average : 8.78467e+307
4b9b3361

Ответ 1

Хорошо, что свойство однородного генератора:

90% значений будут указаны в самом высоком порядке.

Думайте меньше; рассмотрите целочисленный диапазон от 0 до 99 включительно: 90% чертежей будут иметь 2 цифры.