【问题标题】:uniform_real_distribution Is Not Uniformuniform_real_distribution 不统一
【发布时间】:2018-03-28 00:59:12
【问题描述】:

请帮助我理解这一点。运行 sn -p 后:

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

【问题讨论】:

  • 你怎么知道他们在那个范围内?在分配值之前,您是否可能在调试器中查看了 test 的值?请在您打印值的地方创建一个minimal reproducible example
  • 您是否尝试计算平均值、标准差等?
  • 当然可能违反直觉。这是给我的。
  • 对我来说看起来很统一。
  • 准确地说,没有统一的真实分布。那么您的生成器可以生成的实际最大数量是多少?

标签: c++ random


【解决方案1】:

嗯,这就是 统一生成器的属性

90% 的值将处于您指定的最高数量级。

想得更小;考虑整数范围 0 到 99(包括 0 到 99):90% 的图纸将有 2 位数字。

【讨论】:

  • 这个例子非常有利于直觉,但在处理这个主题时往往会失败。让我想起了古老的数数谜语:青蛙每天都会产卵,每次产卵时它们的数量都会翻倍。据说他们花了 10 天时间才将池塘填满。他们花了多长时间才把它填满一半?相同的基本思想:)
  • 谢谢大家。芭丝谢芭,你的回答很简单,也很直观。我并没有真正考虑它,并立即得出结论认为我的错误。这现在很明显了!再次感谢。
  • @StoryTeller 不得不说,在我意识到自己很愚蠢之前,我认为这是世界上最简单的谜语。
  • @StoryTeller,谜语still works as an exercise
  • @CarstenS - 我想知道这些水域中有什么东西可以让事情如此快速地繁殖;)
猜你喜欢
  • 2015-02-06
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
相关资源
最近更新 更多