生成随机数的函数调用另一个用种子生成随机数的函数,种子似乎又被使用了

Function that generates random numbers calls other function that generates random numbers with a seed, and seed seems to be used again

我正在尝试生成一个从均匀分布中生成随机数的函数 Number_Rand() 和另一个生成给定特定种子的随机数的函数 Number_Rand_Seed() - 这样它将始终是固定种子也一样。但是,我在Number_Rand()里面调用了函数Number_Rand_Seed(),不知为什么在Number_Rand()里面也用种子来生成随机数,所以它的输出总是一样的。种子不应该是 Number_Rand_Seed() 内的局部变量吗?每次我调用 np.random 函数时不应该“更新”种子吗(例如,参见 this answer)?那么我应该怎么做才能“更新”Number_Rand() 中的种子并忽略 Number_Rand_Seed() 中的种子?

这是一个例子:

def Number_Rand_Seed():
    np.random.seed(300121)
    a = np.random.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()) 

输出为

(9.354120260352017, 2.552916103146633)
(9.354120260352017, 2.552916103146633)
(9.354120260352017, 2.552916103146633)

但我想要类似

的东西
(9.354120260352017, 8.823425849537022)
(9.354120260352017, 5.950595370176398)
(9.354120260352017, 9.992406389398592)

设置后如果想重新设置种子,可以使用函数:

numpy.random.seed()

它将种子更改为随机值,如下所示:

def Number_Rand_Seed():
    np.random.seed(300121)
    a = np.random.uniform(0, 10)
    return a

def Number_Rand():
    a = Number_Rand_Seed()
    np.random.seed()
    b = np.random.uniform(0, 10)
    return a, b

for i in range(3):
    print(Number_Rand()) 

在最近的 numpy 版本中,您可以使用 np.random.default_rng 创建单独的随机数生成器。

在下文中,我将其用于 a,同时保留 b 的默认值:

In [35]: def Number_Rand_Seed():
    ...:     rng = np.random.default_rng(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())
    ...: 
(9.98668624527619, 2.7036401003521817)
(9.98668624527619, 9.154952983315784)
(9.98668624527619, 1.413705001678095)
In [36]: Number_Rand()
Out[36]: (9.98668624527619, 5.274283695955279)

或者在函数外定义一个“默认”rngNumber_Rand_Seed 中的 rng 是本地的,不会干扰在其外部定义的 rng。当然,如果我使用不同的名称,代码对人类来说会更清晰。

...: rng = np.random.default_rng()
...: def Number_Rand():
...:     a = Number_Rand_Seed()
...:     b = rng.uniform(0, 10)
...:     return a, b