numpy 如何在每次代码运行时使用循环中的种子来获取相同的随机样本?

piztneat  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(133)

我想使用随机数生成数据,然后使用生成的数据生成带有替换的随机样本。问题是,使用random.seed(10)只修复生成数据的初始随机数,但不修复循环内生成的随机样本,每次我运行代码时,我都会获得相同的生成数据但不同的随机样本,我希望获得相同的随机样本,以便获得可重现的结果。代码如下:

import numpy as np
import random

np.random.seed(10)

data = list(np.random.binomial(size = 215 , n=1, p= 0.3))

sample_mean = []

for i in range(1000):

    sample = random.choices(data, k=215)
    mean = np.mean(sample)
    sample_mean.append(mean)

print(np.mean(sample_mean))

np.mean(sample_mean)应该在每次运行代码时检索相同的值,但这并没有发生。
我尝试在循环中输入随机种子(I),但不起作用。

7jmck4yq

7jmck4yq1#

您的random.choices(data, k=215)来自Python内置的random库,该库的种子与numpy.random中的种子不同,因此输入NumPy是不够的。
这里的正确解决方案是在这里使用numpy np.random.choice,因为您已经在使用numpy了。

import numpy as np

np.random.seed(10)

data = np.random.binomial(size=215, n=1, p=0.3)

sample_mean = []

for i in range(1000):
    sample = np.random.choice(data,size=215)
    mean = np.mean(sample)
    sample_mean.append(mean)

print(np.mean(sample_mean))

PS:在data上调用list是不必要的,这会减慢代码的速度。

jjhzyzn0

jjhzyzn02#

修复np.random的种子不会修复random的种子...
因此,只需添加一行代码来修复两个种子,就可以得到可重现的结果:

import numpy as np
import random

np.random.seed(10)
random.seed(10)

data = list(np.random.binomial(size=215, n=1, p=0.3))

sample_mean = []

for i in range(1000):
    sample = random.choices(data, k=215)
    mean = np.mean(sample)
    sample_mean.append(mean)

print(np.mean(sample_mean))

或者,您也可以使用np.random.choices而不是random.choices

相关问题