【发布时间】: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。 -
您是否尝试计算平均值、标准差等?
-
当然可能违反直觉。这是给我的。
-
对我来说看起来很统一。
-
准确地说,没有统一的真实分布。那么您的生成器可以生成的实际最大数量是多少?