STL随机分布和可移植性

stl random distributions and portability

本文关键字:可移植性 分布 随机 STL      更新时间:2023-10-16

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

例如,对于每个不同的标准库实现,下面的代码几乎肯定会输出不同的内容。

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

假设我想要进行过程生成,并希望相同的起始种子能够在不同平台和编译器上产生相同的结果。我做不到。我必须"回归"到使用boost。为什么这不是一个缺陷?

这不是缺陷,这是设计的。其基本原理可以在标准库中添加可扩展随机数功能的建议(N1398)中找到,该建议说(强调mine):

另一方面,规范只适用于发行版定义统计结果,而不是使用精确的算法。这不同于引擎,因为对于分配算法,对其正确性的严格证明是可用的,通常在输入随机数(真正)均匀的前提条件分布。例如,至少有几个算法已知从均匀地产生正态分布随机数分布式的。哪一个最有效取决于at最小的相对执行速度为各种超越函数,缓存和分支预测行为的CPU,和期望的内存使用。因此,这一建议留下了选择算法的实现。它跟随输出序列发行版在不同的实现之间是不相同的。它是预期的实现将仔细选择算法发行版,因为它肯定会给客户带来惊喜如果某个分布产生不同的数到下一个实现版本。

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

指定了如何产生各种分布的算法作为实现定义的,因为有大量的每个分布已知的算法。每个都有不同的权衡在速度方面,适应最新的计算机体系结构,以及内存使用。实现需要记录其选择用户可以判断它的质量是否可以接受。