1

我正在尝试生成一个函数,该函数从均匀分布生成随机数Number_Rand(),另一个函数在给定某个种子的情况下生成随机数Number_Rand_Seed()- 这样对于固定种子,它总是相同的。但是,我调用Number_Rand_Seed()里面的函数Number_Rand(),并且出于某种原因种子也用于在里面生成随机数Number_Rand(),所以它的输出总是一样的。种子不应该是内部的局部变量Number_Rand_Seed()吗?每次我调用 np.random 函数时不应该“更新”种子吗(例如,参见这个答案)?那我应该怎么做才能“更新”里面的种子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)
4

2 回答 2

1

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

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()) 
于 2021-10-28T10:34:21.577 回答
0

在最近的 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)

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

...: rng = np.random.default_rng()
...: def Number_Rand():
...:     a = Number_Rand_Seed()
...:     b = rng.uniform(0, 10)
...:     return a, b
于 2021-10-28T16:13:06.293 回答