uniform_real_distribution is not uniform

365
18 октября 2017, 06:58

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

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 до maximum double?

Answer 1

это свойство генератора.

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

Answer 2

Если вы хотите увидеть разные степени, то генерировать надо не равномерное распределение, а типа логарифмического - т.е. равномерно должны быть распределены значения показателя степени...

Давайте подумаем. У вас 1000 равномерно распределенных чисел. Т.е. в каждую тысячную долю диапазона от 2.2e-308 до 1.79e308 должно попасть по 1 числу. Т.е. одно число в диапазоне от 0 (пренебрежем этой минус 308 степенью...) до 1.79e305. И то не обязательно :) Еще одно - от 1.79e305 до 3.6e305. ну, и так далее.

Если вы хотите получить, скажем, число меньше 1e300, то вам нужно порядка 100 миллионов чисел, чтоб одно попало в этот диапазон.

Так понятнее?

READ ALSO
Лишний вывод в файл

Лишний вывод в файл

Вот у меня есть функция, которая создает файл размеров в 10 КБ

294
Знакомство с тестами

Знакомство с тестами

Никогда не писал модульных тестов, появилось задание с ними познакомиться и научиться использоватьЕсть некая функция "сортировки" массива...

259
Как поместить в QTableWidget изображение?

Как поместить в QTableWidget изображение?

Необходимо поместить в QTableWidget изображение, с возможностью его перемещать внутри таблицы по ячейкам, как это делается нормально?

281