Numpy随机种子问题:gt值未从种子1的预期结果起始
问题:Numpy随机种子初始化后,Beta分布生成的第一个结果被跳过
设置np.random.seed(1)后,原代码生成的gt值跳过了测试代码中的第一个结果,直接从第二个结果开始输出。
原代码
num= 100 obs=[] np.random.seed(1) for i in range(num): N=[] CF3_1=[] CF3_2=[] i=2 salvage= np.random.triangular(salvage_min, salvage_mode, salvage_max) inv= np.random.uniform(inv_min, inv_max) for y in range(0,5): gt= 14.747101 + 11.664259 * np.random.beta(0.645868, 0.920589) print(gt)
简化测试代码
np.random.seed(1) gt= 14.747101 + 11.664259 * np.random.beta(0.645868, 0.920589) print(gt)
测试代码输出
17.889105013452703 14.747134750650536 19.474766202077234 16.967191836499126 18.465043981244925 18.03420202040634 15.794033025059752
原代码输出
14.747134750650536 19.474766202077234 16.967191836499126 18.465043981244925 18.03420202040634
原因分析
Numpy的全局随机数生成器状态是共享的,每次调用任何随机函数(比如triangular、uniform、beta)都会推进这个状态。原代码中,在调用beta生成gt之前,先调用了np.random.triangular和np.random.uniform,这两个函数消耗了种子初始化后的前两个随机数,导致后续beta生成的第一个值对应测试代码中beta生成的第二个值。
解决方案
方案1:为gt单独使用独立的随机生成器
如果希望gt的生成不受其他随机函数影响,可创建单独的RandomState对象来生成gt:
num= 100 obs=[] # 为gt创建独立的随机生成器,初始化种子为1 gt_rng = np.random.RandomState(1) for i in range(num): N=[] CF3_1=[] CF3_2=[] i=2 salvage= np.random.triangular(salvage_min, salvage_mode, salvage_max) inv= np.random.uniform(inv_min, inv_max) for y in range(0,5): # 使用独立生成器生成beta值 gt= 14.747101 + 11.664259 * gt_rng.beta(0.645868, 0.920589) print(gt)
方案2:调整随机函数调用顺序(如果业务逻辑允许)
如果不需要在生成gt之前生成salvage和inv,可以先完成gt的生成,再调用其他随机函数:
num= 100 obs=[] np.random.seed(1) for i in range(num): N=[] CF3_1=[] CF3_2=[] i=2 # 先生成gt for y in range(0,5): gt= 14.747101 + 11.664259 * np.random.beta(0.645868, 0.920589) print(gt) # 再生成salvage和inv salvage= np.random.triangular(salvage_min, salvage_mode, salvage_max) inv= np.random.uniform(inv_min, inv_max)
方案3:每次循环重置种子(生成重复的gt序列)
如果希望每次循环都生成完全相同的gt序列,可以将种子初始化移到循环内部:
num= 100 obs=[] for i in range(num): np.random.seed(1) # 每次循环重置种子 N=[] CF3_1=[] CF3_2=[] i=2 salvage= np.random.triangular(salvage_min, salvage_mode, salvage_max) inv= np.random.uniform(inv_min, inv_max) for y in range(0,5): gt= 14.747101 + 11.664259 * np.random.beta(0.645868, 0.920589) print(gt)
内容的提问来源于stack exchange,提问作者Vincent Lee
相关产品推荐
相关产品推荐

