【发布时间】: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