【问题标题】:Re-initializing random distribution重新初始化随机分布
【发布时间】:2021-04-13 00:58:55
【问题描述】:

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

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

我已经检查过,对于均匀分布和正态分布,它在经验上是正确的。我可以从 的每个发行版中期待它吗?

【问题讨论】:

  • 我想起了几年前的一次 CppCon 演讲,它处理了同样的问题;我已经相应地编辑了我的答案。

标签: c++ c++11 random


【解决方案1】:

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

也就是说,是的,不同分布的行为是 guaranteed by the standard 以特定方式运行。

STL recommends,因为发行版相对便宜,所以不必担心每次需要一个或需要一个新范围时都构建一个。他还说如果不想每次都构造一个,可以使用param成员函数来改变分布范围。

如果上述直接 Youtube 链接失效(寻求 30 分钟),Microsoft Channel9 链接:https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful

编辑

我正在重新观看几年前的 CppCon 演讲,该演讲讨论了这个确切的问题。结果?将分布构造为局部变量即使在循环内 is 4.5 times faster

【讨论】:

  • 但分布可能有内部状态。
猜你喜欢
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 2018-10-12
  • 2023-03-20
相关资源
最近更新 更多