生成随机数的函数调用另一个用种子生成随机数的函数,种子似乎又被使用了
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)
或者在函数外定义一个“默认”rng
。 Number_Rand_Seed
中的 rng
是本地的,不会干扰在其外部定义的 rng
。当然,如果我使用不同的名称,代码对人类来说会更清晰。
...: rng = np.random.default_rng()
...: def Number_Rand():
...: a = Number_Rand_Seed()
...: b = rng.uniform(0, 10)
...: return a, b
我正在尝试生成一个从均匀分布中生成随机数的函数 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)
或者在函数外定义一个“默认”rng
。 Number_Rand_Seed
中的 rng
是本地的,不会干扰在其外部定义的 rng
。当然,如果我使用不同的名称,代码对人类来说会更清晰。
...: rng = np.random.default_rng()
...: def Number_Rand():
...: a = Number_Rand_Seed()
...: b = rng.uniform(0, 10)
...: return a, b