【发布时间】:2016-11-07 10:13:20
【问题描述】:
我在玩一些 c++ 随机引擎,有些事情让我很不高兴。 注意到我的值大致相同,我做了以下测试:
#include <random>
#include <functional>
#include <iostream>
int main()
{
auto res = std::random_device()();
std::ranlux24 generator(res);
std::uniform_int_distribution<uint32_t> distribution;
auto roll = std::bind(distribution, generator);
for(int j = 0; j < 30; ++j)
{
double ssum = 0;
for(int i = 0; i< 300; ++i)
{
ssum += std::log10(roll());
}
std::cout << ssum / 300. << std::endl;
}
return 0;
}
无论我使用什么引擎,我打印的值都是大约 9.2,看起来更像是一个正态分布。 有什么我没有正确理解的吗? 谢谢, 纪尧姆
【问题讨论】:
-
你为什么选择
log10?这不会显着影响分布的形状吗? -
根据您使用的生成器,您可能需要多次调用
random_device才能正确地为所有内部状态播种。例如,std::mt19937使用 624 字节的内部状态,因此您需要一个std::seed_seq和多个输入来播种所有这些状态。参见例如stackoverflow.com/questions/15509270/… -
另见central limit theorem。您正在平均随机数生成器的结果。 “[The] 足够多的独立随机变量迭代的算术平均值,每个变量都有明确定义的(有限)期望值和有限方差,将近似正态分布,而不管基础分布如何。”您正在取 300 个随机分布的自变量的平均值。