如何在循环中设置随机种子以获取可复现的随机样本?
问题原因
你代码里同时混用了NumPy的随机模块和Python标准库的random模块,这两个模块的随机状态是完全独立的。你只固定了np.random的种子,但循环中用于抽样的random.choices属于random模块,它的随机状态没被固定,所以每次运行的抽样结果会不一样。之前在循环内用random.seed(i)无效,是因为每次循环都重置种子,导致抽样的起始状态随i变化,反而破坏了全局的随机一致性。
解决方案
有两种简单的修复方式,任选其一即可:
方式1:固定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))
方式2:统一使用NumPy的随机函数抽样
放弃使用random模块,全程用NumPy的函数完成抽样,这样只需要管理NumPy的种子即可:
import numpy as np np.random.seed(10) # 直接保留NumPy数组,无需转成list data = np.random.binomial(size=215, n=1, p=0.3) sample_mean = [] for i in range(1000): # replace=True 对应有放回抽样,和random.choices行为一致 sample = np.random.choice(data, size=215, replace=True) mean = np.mean(sample) sample_mean.append(mean) print(np.mean(sample_mean))
内容的提问来源于stack exchange,提问作者Various Listen
相关产品推荐
相关产品推荐

