随机数生成器在for循环中生成相同的数字

Random number generator generating the same number inside of a for loop

提问人:Ana Dias 提问时间:11/17/2023 更新时间:11/17/2023 访问量:100

问:

我实现了一种蒙特卡罗策略,在给定次优参数的初始点的情况下估计模型的参数。为了评估围绕此最佳值的不同条件,我使用了 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 开始,“参数”的值没有改变。

我只有在启动“for”循环以构造“parameters”之前设置随机数生成器的种子时才设法解决了这个问题,如下面的代码所示:

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)

有人可以向我解释为什么会这样吗?

python numpy 随机

评论

1赞 Michel Kok 11/17/2023
请向我们展示美联社的内容
0赞 Ana Dias 11/17/2023
ap 是一个字典,其中包含 'parameter' 中每个参数的最小值和最大值 ap = {str(i):[tudo[i]*0.85,tudo[i]*1.15] for i in range(len(tudo))}
0赞 Kamil 11/17/2023
嗨,安娜,我纠正了我的答案。也许它现在更有用
0赞 slothrop 11/17/2023
我无法复制这个,例如: ideone.com/6rOvLT 您确定您正在运行的代码正是问题中的内容吗?

答:

-3赞 Kamil 11/17/2023 #1

您的解决方法是在每次迭代开始时使用 设置一个新的随机种子。这成功了,因为种子基本上为生成随机数设定了起点。在不改变种子的情况下,你每次都会得到相同的“随机”数字。通过每次迭代更改它,您可以确保获得一批新的随机性。 您可能想研究一下 和 是 NumPy 新随机数生成系统的一部分,而不是使用 。它们更灵活,并具有一些简洁的功能。np.random.seed(j)np.random.uniformnumpy.random.Generatornumpy.random.PCG64

下面是一个简单示例:

from numpy.random import default_rng

rng = default_rng()  # This creates a new random number generator

for j in range(iterations):
    print("PERFORMING ITERATION: " + str(j+1) + ' OF ' + str(iterations))

    # WIDE PARAMETRIC SPACE
    parameters = []
    for k in list(ap.keys()):
        p_0 = rng.uniform(ap[k][0], ap[k][1])  # Use the new generator
        parameters.append(p_0)

    # and so on....

这样一来,您就使用了一种更现代和推荐的方法来生成随机数。它会自动为您处理种子内容,因此您每次都会获得不同的数字,而无需手动设置种子。

评论

2赞 slothrop 11/17/2023
“在不改变种子的情况下,你每次都会得到相同的'随机'数字。您是否能够使用 OP 的原始代码复制此行为?这不是预期的 - 除非您重置种子,否则种子不会在循环中“重置”为相同的值。