重新初始化随机分布

时间:2021-04-13 00:58:55

标签: c++ c++11 random

期望 的分布在每个下一个数字请求之前重新初始化的行为与初始化一次的行为相同是否合理?换句话说,这样做:

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];
} 

我已经检查过,对于均匀分布和正态分布,它凭经验是成立的。我可以从 中的每个分布中得到它吗?

1 个答案:

答案 0 :(得分:2)

我基本上做你的第一个实现所做的。每次我需要分发时构建一个。

也就是说,是的,不同分布的行为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