均匀实数分布并不均匀

26

请帮我理解这个。运行代码片段后:

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 到 double 类型最大值之间均匀分布的随机值。

提前致谢!


以下是更完整的示例:

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

2
你怎么知道它们在那个范围内?在赋值之前,你是否在调试器中查看了test的值?请创建一个[mcve]并打印出这些值。 - nwp
你尝试过计算平均值、标准差等吗? - Galik
当然可能令人感到违反直觉,对我来说就是这样。 - Ron
看起来对我来说很一致。 - Mark
准确地说,不存在统一的实数分布。那么你的生成器能够生成的实际最大数字是多少? - Vim
1个回答

76

好的,这就是一个 均匀生成器 的特性:

90%的值将在您指定的最高数量级中。

想得小一点;考虑整数范围从0到99(包括0和99):90%的数字将有两位数。


10
这个例子非常有助于直觉理解,因为在处理这个主题时,直觉通常会失败。让我想起了一个古老的数学谜题:蛤蟆每天产卵,下一次比上一次多一倍。已知它们用了10天时间将池塘填满。那么它们需要多久才能把池塘填到一半?基本思想相同 :) - StoryTeller - Unslander Monica
1
感谢大家。Bathsheba,您的答案简单而直观。我没有真正考虑过它,并立即得出了我的错误结论。现在这很明显!再次感谢。 - Aesope
4
@StoryTeller:得说,我之前觉得那是世界上最简单的谜语,直到意识到自己太蠢了。 翻译:必须说,我一开始认为那是世界上最简单的谜语,直到意识到我太傻了。 - Lord Farquaad
@StoryTeller,这个谜语仍然可以用作一项练习 - Carsten S
在我看来,带有有用比喻的答案总是最好的。 - Barmar
4
@CarstenS - 我想知道那些水里有什么能让生物繁殖得这么快 ;) - StoryTeller - Unslander Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接