python - 可重现 NumPy 的随机结果:重新播种 vs 重新创建
问题描述
根据 NumPy 的numpy.random.seed()
文档:
这是一个方便的遗留功能。
最佳做法是不要重新植入 BitGenerator,而是重新创建一个新的。出于遗留原因,此方法在这里。这个例子展示了最佳实践。
但是,我注意到重新创建位生成器的结果是不可重现的。相反,重新播种位生成器会产生可重现的结果。为什么会这样?我究竟做错了什么?
此外,他们的结果也不同。为什么会这样?使用的不是相同的 Mersenne Twister (MT) 算法吗?
我的重现我的观察的脚本如下所示。
import numpy as np
from numpy.random import MT19937
from numpy.random import RandomState, SeedSequence
import matplotlib.pyplot as plt
seed=123456789
# Reseed a BitGenerator
np.random.seed(seed)
r1 = np.random.random_integers(1, 6, 1000)
np.random.seed(seed)
r2 = np.random.random_integers(1, 6, 1000)
# Recreate a BitGenerator
rs = RandomState(MT19937(SeedSequence(seed)))
c1 = np.random.random_integers(1, 6, 1000)
rs = RandomState(MT19937(SeedSequence(seed)))
c2 = np.random.random_integers(1, 6, 1000)
# Visualise results
fig, axes = plt.subplots(1, 2)
axes[0].hist(r1, 11, density=True)
axes[0].hist(r2, 11, density=True)
axes[0].set_title('Reseed a BitGenerator')
axes[1].hist(c1, 11, density=True)
axes[1].hist(c2, 11, density=True)
axes[1].set_title('Recreate a BitGenerator')
plt.show()
解决方案
在您的示例中,当您重新创建RandomState
对象时,您在获取随机数时没有使用它。
创建时,RandomState
您不会重新播种整个 numpy 环境。而是创建一个新的随机生成器对象。
将您的代码更改为:
# Recreate a BitGenerator
rs1 = RandomState(MT19937(SeedSequence(seed)))
c1 = rs1.random_integers(1, 6, 1000)
rs2 = RandomState(MT19937(SeedSequence(seed)))
c2 = rs2.random_integers(1, 6, 1000)
推荐阅读
- batch-file - 在新窗口中从 bash 运行 bat 文件并等待响应
- python-3.x - python请求错误检查-mk API
- android - 通过 Firebase 回收器视图搜索时无法使用
- database - 如何使用 EF 核心添加新表
- linux - 如何在 PowerShell 中为 Linux 创建永久环境变量
- php - 亚马逊 MWS 报告 API 自动化
- information-retrieval - 了解 OpenIE 5 输出
- apache - Apache requestheaders 环境变量和早期
- excel - 删除 Excel 打开窗口 (Excel 2016)
- php - 按相关文章计数排序标签实体