繁体   English   中英

跨平台 numpy.random.seed()

[英]cross platform numpy.random.seed()

文档说:

兼容性保证固定种子和使用相同参数对“RandomState”方法的固定系列调用将始终产生相同的结果直至出现舍入误差,除非值不正确。 不正确的值将得到修复,并且在相关文档字符串中会注明进行修复的 NumPy 版本。 只要以前的行为保持不变,就允许扩展现有参数范围和添加新参数。

没有提到操作系统。

如果我在windows和linux上调用np.random.seed(42) ,之后生成的随机数是否相同? 在不同版本的 64 位 Ubuntu 中是否相同?

我假设 rng 使用系统库,所以代码可能不可移植。 如果那是真的,有解决办法吗? 我知道这可能很丑陋,例如将 linux rng 系统更改为模拟 windows 的系统。但我已准备好创造性的解决方案。

更新自numpy v1.17 (2019 年年中):
结果应该跨平台相同,但跨 numpy 版本不同。

np.random.seed被描述为“方便的遗留功能”; 它和更新的/推荐的替代np.random.default_rng不能再依赖于在 numpy 版本中产生相同的结果,除非专门使用 np.random.RandomState 提供的遗留/兼容性np.random.RandomState 虽然 RandomState 模块保证提供一致的结果,但它不会随着算法(或正确性)改进而更新,并且不鼓励在单元测试和向后兼容性之外使用。

请参阅NEP 0019:随机数生成器策略 这实际上是一本不错的书:)摘要如下:

在过去的十年中,NumPy 对其所有随机数分布的数字 stream 都有严格的向后兼容性政策。 与 numpy 中的其他数值组件不同,如果它们保持正确,通常允许在修改结果时返回不同的结果,我们强制随机数分布在每个版本中始终产生完全相同的数字。 我们的流兼容性保证的目标是为 numpy 版本的模拟提供精确的可重复性,以促进可重复的研究。 然而,这一政策使得使用更快或更准确的算法来增强任何分布变得非常困难。 经过十年对科学软件生态系统的经验和改进,我们相信现在有更好的方法来实现这些目标。 我们建议放宽我们严格的流兼容性政策,以消除接受对我们的随机数生成功能的贡献的障碍。

这已在 numpy 中实现。截至当前写作(numpy 版本 1.22), numpy.random.default_rng()使用默认的BitGenerator构造一个新的Generator 但在np.random.Generator的描述中,附上了以下指导:

无兼容性保证

Generator 不提供版本兼容性保证。 特别是,随着更好的算法的发展,位 stream 可能会发生变化。

因此,使用np.random.default_rng()将跨平台保留相同版本 numpy 的随机数,但不会跨版本。 确保再现性的最佳实践是保存您的确切环境,例如在 docker 容器中。 除此之外,存储随机生成的数据的结果并在下游工作流中使用保存的结果可以帮助提高可重复性,尽管这当然不会像 docker 容器那样使您免于稍后在工作流中发生 API 更改。

根据 sascha 的评论,随机数与平台无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM