提问人:Ana Dias 提问时间:11/17/2023 更新时间:11/17/2023 访问量:100
随机数生成器在for循环中生成相同的数字
Random number generator generating the same number inside of a for loop
问:
我实现了一种蒙特卡罗策略,在给定次优参数的初始点的情况下估计模型的参数。为了评估围绕此最佳值的不同条件,我使用了 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)
有人可以向我解释为什么会这样吗?
答:
-3赞
Kamil
11/17/2023
#1
您的解决方法是在每次迭代开始时使用 设置一个新的随机种子。这成功了,因为种子基本上为生成随机数设定了起点。在不改变种子的情况下,你每次都会得到相同的“随机”数字。通过每次迭代更改它,您可以确保获得一批新的随机性。
您可能想研究一下 和 是 NumPy 新随机数生成系统的一部分,而不是使用 。它们更灵活,并具有一些简洁的功能。np.random.seed(j)
np.random.uniform
numpy.random.Generator
numpy.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 的原始代码复制此行为?这不是预期的 - 除非您重置种子,否则种子不会在循环中“重置”为相同的值。
评论