如何在Python函数内局部设置NumPy随机种子而不影响全局状态?
解决NumPy局部随机种子不干扰全局状态的简便方案
不需要手动保存和恢复全局随机状态,最直接的方法是在函数内部创建独立的随机生成器实例,彻底和全局随机状态隔离。
推荐写法(NumPy 1.17+,官方推荐)
使用np.random.default_rng创建专属的随机生成器,完全不影响全局np.random的状态:
import numpy as np def random(): # 函数内创建独立随机生成器,种子设为420 rng = np.random.default_rng(seed=420) rng.randint(1, 100) rng.randint(1, 100) return None np.random.seed(69) for n in range(3): np.random.randint(1,100) # 输出:55,76,74 random() for n in range(3): print(np.random.randint(1,100)) # 输出:91,56,21
兼容旧版NumPy的写法
如果使用低于1.17的NumPy版本,可以用RandomState创建独立实例:
def random(): rng = np.random.RandomState(seed=420) rng.randint(1, 100) rng.randint(1, 100) return None
为什么这个方案更优
- 代码简洁,不用手动处理全局状态的保存与恢复,避免遗漏导致的bug
- 函数的随机逻辑完全独立,不会和全局或其他函数的随机操作互相干扰
- 新版
GeneratorAPI支持更多随机分布,功能比旧版更完善
内容的提问来源于stack exchange,提问作者Abilash
相关产品推荐
相关产品推荐

