问题描述
期望
std::default_random_engine generator;
int p[10]={};
for (int i=0; i<nrolls; ++i) {
std::uniform_int_distribution<int> distribution(0,9);
int number = distribution(generator);
++p[number];
}
具有相同的分布
std::uniform_int_distribution<int> distribution(0,9);
std::default_random_engine generator;
int p[10]={};
for (int i=0; i<nrolls; ++i) {
int number = distribution(generator);
++p[number];
}
我已经检查过,对于均匀分布和正态分布,它凭经验是成立的。我可以从
解决方法
我基本上做你的第一个实现所做的。每次我需要分发时构建一个。
也就是说,是的,不同分布的行为guaranteed by the standard以特定方式表现。
STL recommends,因为分布相对便宜,所以不必担心每次需要一个或需要一个新范围时都构建一个。他还说如果你不想每次都构造一个,你可以使用 param 成员函数来改变分布范围。
Microsoft Channel9 链接,如果上面的直接 Youtube 链接失效(请在 30 分钟内进入):https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful
编辑
我正在重新观看几年前讨论这个确切问题的 CppCon 演讲。结果?将分布构建为局部变量甚至在循环内 is 4.5 times faster。