为什么标准发行版的结果不是强制要求在各实现之间保持一致?另一方面,伪随机数生成器的结果强制要求相同。
例如,以下几乎肯定会为每个不同的标准库实现打印不同的内容。
std::mt19937 random {100};
std::normal_distribution<> dist;
std::cout << dist(random);
假设我想进行程序生成,并希望相同的起始种子在平台和编译器之间产生相同的结果。我无法用stl做到这一点。我必须“回归”使用提升。为什么这不是缺陷?
答案 0 :(得分:13)
这不是缺陷,而是设计上的。这个理由可以在A Proposal to Add an Extensible Random Number Facility to the Standard Library (N1398)中找到(强调我的):
另一方面,仅限分发的规格 定义统计结果,而不是使用的精确算法。这个 与引擎不同,因为对于分发算法, 可以获得他们正确性的严格证明,通常是在 输入随机数是(真实地)均匀的前提条件 分散式。例如,至少有一些算法 已知从均匀地产生正态分布的随机数 分布式的。 哪一个最有效取决于 至少各种先验的相对执行速度 CPU的功能,缓存和分支预测行为,以及 期望的记忆使用。因此,该提案留下了选择 算法实现。 跟随输出序列 各个实现的发行版本不一致。它是 预计实现将仔细选择算法 预先分发,因为它对客户来说肯定是令人惊讶的 如果某些分布产生不同的数字 实施版本到下一个。
在实施定义部分中重申了这一点:
指定了如何生成各种分布的算法 作为实现定义,因为有各种各样的 每种分布都知道的算法。每个都有不同的权衡 在速度方面,适应最近的计算机架构,以及 记忆用法。实施需要记录其选择 用户可以判断质量是否可以接受。