Python 可复制的NumPy随机结果:重新播种与重新播种

Python 可复制的NumPy随机结果:重新播种与重新播种,python,numpy,random-seed,Python,Numpy,Random Seed,根据NumPy的NumPy.random.seed: 这是一个方便的传统功能 最好的做法是不重新设置位生成器的种子,而是重新创建 一个新的。由于遗留原因,这里使用此方法。这个例子 展示最佳实践 然而,我注意到重新创建位生成器的结果是不可复制的。相反,重新设定位生成器的种子会给出可再现的结果。为什么会这样?我做错了什么 此外,他们的结果也不同。为什么会这样?不是使用了相同的Mersenne Twister MT算法吗 下面是我复制观察结果的脚本 import numpy as np from nu

根据NumPy的NumPy.random.seed:

这是一个方便的传统功能

最好的做法是不重新设置位生成器的种子,而是重新创建 一个新的。由于遗留原因,这里使用此方法。这个例子 展示最佳实践


然而,我注意到重新创建位生成器的结果是不可复制的。相反,重新设定位生成器的种子会给出可再现的结果。为什么会这样?我做错了什么

此外,他们的结果也不同。为什么会这样?不是使用了相同的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 env设定种子。 而是创建一个新的随机生成器对象

将代码更改为:

# 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)

然而,我注意到重新创建位生成器的结果是不可复制的。相反,重新设定位生成器的种子会给出可再现的结果。为什么会这样?我做错了什么?您没有使用重新创建的生成器。您创建了一个新的生成器,但仍然使用传统的单例。除非您需要与使用序列的旧MT兼容,否则您最好切换到PCG,它客观上在每个轴上都更好—更好的统计特性、更快的速度和更少的内存。我希望NumPy的文档将您的示例附加到他们的示例中:更容易理解;