You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何numpy随机数生成器在for循环中生成相同参数值?

问题:蒙特卡洛策略中随机参数不再变化的原因

我实现了蒙特卡洛策略,基于次优参数初始点估计模型参数。为评估最优值周边的不同情况,我使用numpy.random.uniform(min, max)生成随机数,代码如下:

for j in range(iterations): 
    print(" PERFORMING ITERATION: " + str(j+1)+' OF '+ str(iterations) )#+ (" - CASE: " + str(count) + " / " + str(len(aux_it))))
    # WIDE PARAMETRIC SPACE
    parameters = []
    for k in list(ap.keys()):
        p_0 = np.random.uniform(ap[k][0],ap[k][1])
        parameters.append(p_0)

    if True:
        with warnings.catch_warnings():
            warnings.simplefilter('error')
            print('parameters: ',parameters)
            mse,var1,var2 = ridge_mse2(np.array(parameters),tagsUext,P1)

但我发现从j=1开始,parameters的值不再变化。直到在构建parameters的for循环前设置随机数种子np.random.seed(j),代码如下:

for j in range(iterations): 
    print(" PERFORMING ITERATION: " + str(j+1)+' OF '+ str(iterations) )#+ (" - CASE: " + str(count) + " / " + str(len(aux_it))))
    # WIDE PARAMETRIC SPACE
    parameters = []
    np.random.seed(j)
    for k in list(ap.keys()):
        p_0 = np.random.uniform(ap[k][0],ap[k][1])
        parameters.append(p_0)
    
    if True:
        with warnings.catch_warnings():
            warnings.simplefilter('error')
            print('parameters: ',parameters)
            mse,var1,var2 = ridge_mse2(np.array(parameters),tagsUext,P1)

请问这一现象的原因是什么?

原因分析

  • 核心问题出在你调用的ridge_mse2函数内部:它大概率重置了numpy的随机种子,或者调用了其他会固定/重置随机数生成器状态的代码。
  • 第一次迭代(j=0)时,系统默认的随机种子生成了一组随机参数;但ridge_mse2执行完毕后,随机数生成器的状态被重置为某个固定值(比如种子0),导致后续每次循环调用np.random.uniform时,都是从同一个起点生成随机数,自然得到完全相同的parameters。
  • 手动添加np.random.seed(j)后,每次循环都会用递增的j值作为新种子初始化随机数生成器,覆盖了ridge_mse2内部的种子重置操作,所以每次能生成不同的随机参数。

你可以通过在ridge_mse2调用前后打印np.random.get_state()来验证:对比两次打印的结果,如果状态完全一致,就说明该函数修改了随机数生成器的状态。


内容的提问来源于stack exchange,提问作者Ana Dias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:28:34