stl随机分布和可移植性

时间:2014-07-03 10:16:48

标签: c++ c++11 random stl cross-platform

为什么标准发行版的结果不是强制要求在各实现之间保持一致?另一方面,伪随机数生成器的结果强制要求相同。

例如,以下几乎肯定会为每个不同的标准库实现打印不同的内容。

std::mt19937 random {100};
std::normal_distribution<> dist;

std::cout << dist(random);

假设我想进行程序生成,并希望相同的起始种子在平台和编译器之间产生相同的结果。我无法用stl做到这一点。我必须“回归”使用提升。为什么这不是缺陷?

1 个答案:

答案 0 :(得分:13)

这不是缺陷,而是设计上的。这个理由可以在A Proposal to Add an Extensible Random Number Facility to the Standard Library (N1398)中找到(强调我的):

  

另一方面,仅限分发的规格   定义统计结果,而不是使用的精确算法。这个   与引擎不同,因为对于分发算法,   可以获得他们正确性的严格证明,通常是在   输入随机数是(真实地)均匀的前提条件   分散式。例如,至少有一些算法   已知从均匀地产生正态分布的随机数   分布式的。 哪一个最有效取决于   至少各种先验的相对执行速度   CPU的功能,缓存和分支预测行为,以及   期望的记忆使用。因此,该提案留下了选择   算法实现。 跟随输出序列   各个实现的发行版本不一致。它是   预计实现将仔细选择算法   预先分发,因为它对客户来说肯定是令人惊讶的   如果某些分布产生不同的数字   实施版本到下一个。

在实施定义部分中重申了这一点:

  

指定了如何生成各种分布的算法   作为实现定义,因为有各种各样的   每种分布都知道的算法。每个都有不同的权衡   在速度方面,适应最近的计算机架构,以及   记忆用法。实施需要记录其选择   用户可以判断质量是否可以接受。