STL随机分布和可移植性
stl random distributions and portability
为什么标准发行版的结果没有被强制要求在各个实现之间保持一致?另一方面,伪随机数生成器的结果是必须是相同的。
例如,对于每个不同的标准库实现,下面的代码几乎肯定会输出不同的内容。
std::mt19937 random {100};
std::normal_distribution<> dist;
std::cout << dist(random);
假设我想要进行过程生成,并希望相同的起始种子能够在不同平台和编译器上产生相同的结果。我做不到。我必须"回归"到使用boost。为什么这不是一个缺陷?
这不是缺陷,这是设计的。其基本原理可以在标准库中添加可扩展随机数功能的建议(N1398)中找到,该建议说(强调mine):
另一方面,规范只适用于发行版定义统计结果,而不是使用精确的算法。这不同于引擎,因为对于分配算法,对其正确性的严格证明是可用的,通常在输入随机数(真正)均匀的前提条件分布。例如,至少有几个算法已知从均匀地产生正态分布随机数分布式的。哪一个最有效取决于at最小的相对执行速度为各种超越函数,缓存和分支预测行为的CPU,和期望的内存使用。因此,这一建议留下了选择算法的实现。它跟随输出序列发行版在不同的实现之间是不相同的。它是预期的实现将仔细选择算法发行版,因为它肯定会给客户带来惊喜如果某个分布产生不同的数到下一个实现版本。
在实现定义部分中重申了这一点:
指定了如何产生各种分布的算法作为实现定义的,因为有大量的每个分布已知的算法。每个都有不同的权衡在速度方面,适应最新的计算机体系结构,以及内存使用。实现需要记录其选择用户可以判断它的质量是否可以接受。
相关文章:
- C++Union/Struct位域的实现和可移植性
- 静态库可移植性
- C++:Unicode 字符串文字的可移植性
- 如何使Visual Studio 2017 C++项目在计算机之间更具可移植性
- 在为视频游戏实施基本的二进制序列化时,请担心可移植性
- 重写类以使其更通用,以实现可移植性
- Visual Studio 2015 <=> QtCreator 5 (c++) 代码可移植性
- 通过虚拟接口类导出C 类的可移植性
- 位移位可移植性
- 如何在Visual Studio中进行串行端口编程C++Windows和Linux之间的可移植性?
- 提高 Python 可移植性问题
- 库如何在不同的操作系统之间实现可移植性
- 使用C 11 /最近的G 版本(4.7 / 4.6)的可移植性
- 模板函数实例化的可移植性问题
- XCode、命名空间、C++和代码可移植性
- 嵌入式C++项目 - 需要支持智能指针.可能的可移植性问题
- 使用指针遍历数组的可移植性
- 头文件中内联自由函数的可移植性
- 文件IO中的可移植性问题
- STL随机分布和可移植性