【问题标题】:stl random distributions and portabilitystl 随机分布和可移植性
【发布时间】:2014-08-24 09:58:39
【问题描述】:

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

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

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

std::cout << dist(random);

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

【问题讨论】:

  • 这不是一个答案,只是想一想。对于许多分布,有多种方法可以获得所需的值。正态分布可以使用 box-muller 变换或(递归或泰勒展开)误差函数。这两个使用函数都使用其他函数(如余弦、正弦、对数、误差函数、积分、平方根...)。很难说哪种方法最好(时间与精度),哪种方法可以得到最好的优化。也许在 C++14 中,当人们对这些发行版和实现更加熟悉时,就会强制执行一个标准。
  • 哦,甚至 box-muller 变换也有不同的(极坐标、笛卡尔坐标)实现。无数种乐趣?
  • @user2899162 你的理由是正确的,我在回答中引用了这个提议。

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


【解决方案1】:

这不是缺陷,而是设计使然。可以在A Proposal to Add an Extensible Random Number Facility to the Standard Library (N1398) 中找到这样做的理由(emphasis mine):

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

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

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

【讨论】:

  • 可爱的;因此,如果跨实现的一致性很重要,则必须走非标准库的路线。感谢提案的相关摘录。
  • @Brandon 这就是我能找到的所有东西,所以看起来确实如此。你可以随时在ISO C++ Standard - Discussion 上提出这个问题,看看是否有一些改变的余地。
  • 不错的主意。在快速和稳定之间进行选择会很好;与 中所做的没有什么不同(虽然有点混乱)。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 2011-02-15
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
相关资源
最近更新 更多