stl随机分布和可移植性

Bra*_*don 8 c++ random stl cross-platform c++11

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

例如,以下几乎肯定会为每个不同的标准库实现打印不同的东西.

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

std::cout << dist(random);
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*our 13

这不是缺陷,而是设计上的缺陷.有关这方面的理由可以在向标准库(N1398)添加可扩展随机数设施的提案中找到,该提议称(强调我的):

另一方面,分布的规范仅定义统计结果,而不是使用的精确算法.这与引擎不同,因为对于分布算法,通常在输入随机数(真实地)均匀分布的前提下,可以获得其正确性的严格证明.例如,已知至少有少数算法可以从均匀分布的随机数中产生正态分布的随机数.这些中哪一个最有效取决于至少各种超越函数的相对执行速度,CPU的高速缓存和分支预测行为以及所需的存储器使用.因此,该提议将算法的选择留给了实现.因此,分布的输出序列在实现之间将不相同.预计实现将预先仔细选择用于分发的算法,因为如果某个分发从一个实现版本到下一个实现版本产生不同的数字,那么客户肯定会感到惊讶.

在实现定义部分中重申了这一点,其中说:

如何生成各种分布的算法被指定为实现定义,因为每种分布都有各种各样的算法.每个在速度,适应最近的计算机体系结构和内存使用方面都有不同的权衡.需要实施来记录其选择,以便用户可以判断质量是否可接受.

  • 迷人的; 因此,如果实现之间的一致性很重要,就必须走非标准库的路线。感谢提案的相关摘录。 (2认同)