调用带固定np.random种子的函数后全局随机数结果固定如何处理
问题根源
np.random.seed()修改的是numpy的全局随机数生成器状态,并非函数局部变量。你每次调用Number_Rand_Seed()都会把全局随机状态重置到种子300121对应的初始位置,所以后续调用全局的np.random.uniform输出结果每次都完全一致。
解决方案
给需要固定种子的函数单独创建独立的随机数生成器实例,完全和全局随机状态隔离,二者不会互相影响。
修改后的代码如下:
import numpy as np def Number_Rand_Seed(): # 为该函数单独创建独立随机生成器,指定固定种子,不影响全局状态 rng = np.random.default_rng(seed=300121) a = rng.uniform(0, 10) return a def Number_Rand(): a = Number_Rand_Seed() # 此处调用全局随机生成器,状态不会被上面的函数修改,每次调用都会自动更新 b = np.random.uniform(0, 10) return a, b for i in range(3): print(Number_Rand())
修改后Number_Rand_Seed()每次返回的固定值保持不变,而全局随机生成器的状态不会被重置,b的值每次调用都会变化,完全符合预期输出效果。
如果你使用的是numpy 1.16及更早版本,也可以用RandomState实现相同效果:
def Number_Rand_Seed(): rng = np.random.RandomState(seed=300121) a = rng.uniform(0, 10) return a
内容的提问来源于stack exchange,提问作者Tucci
相关产品推荐
相关产品推荐

