使用内置 python 包的 np.random.uniform() 和 uniform() 之间的区别

Difference Between np.random.uniform() and uniform() using built-in python packages

我正在使用 np.random.uniform() 在 class 中生成一个数字。令人惊讶的是,当我 运行 代码时,我在结果中看不到任何预期的变化。另一方面,当我使用 python 内置包中的 uniform() 时,我看到结果发生了变化,这显然是正常的。

它们真的一样吗?或者它们的实现有什么棘手的地方吗?

提前致谢!

创建一个模块,比如说,blankpaper.py,只需要两行代码

import numpy as np
np.random.seed(420)

然后,在你的主脚本中,执行

import numpy as np 
import blankpaper 

print(np.random.uniform())

你应该得到完全相同的数字。

当模块或库设置 np.random.seed(some_number) 时,它是 globalnumpy.random.*函数的后面是global RandomState生成器的一个实例,重点在global.

很可能您正在导入的东西正在执行上述操作。

将主脚本改为

import numpy as np
import blankpaper

rng = np.random.default_rng()
print(rng.uniform())

而且你每次都应该得到新号码。

default_rng是随机数class、Generator的构造函数。如 documentation

中所述

This function does not manage a default global instance.

在回答问题“[a]你先设置种子吗?”时,你说

Yes, I'm using it but it doesn't matter if I don't use a seed or change the seed number. I checked it several times.

假设我们重新定义 blankpaper.py 以包含行

import numpy as np

def foo():
    np.random.seed(420)
    print("I exist to always give you the same number.")

假设您的主要脚本是

import numpy as np
import blankpaper

np.random.seed(840)

blankpaper.foo()
print(np.random.uniform())

那么你应该得到与执行第一个主脚本(答案顶部)相同的数字。

在这种情况下,种子的设置隐藏在 blankpaper 模块中的一个函数中,但如果 blankpaper.foo 是 class 并且blankpaper.foo__init__() 方法设置种子。

所以全局种子的这个设置可以说是相当“隐蔽”了。

另请注意,以上内容也适用于 random module

中的函数

The functions supplied by this module are actually bound methods of a hidden instance of the random.Random class. You can instantiate your own instances of Random to get generators that don’t share state.

因此,当 random 模块中的 uniform() 每次为您生成不同的数字时,很可能是因为您或其他模块设置了由 [=28] 中的函数共享的种子=]模块。

numpyrandom 中,如果您的 class 或应用程序想要拥有自己的状态,请从 numpy 创建 Generator 的实例或来自 randomRandom(或 SystemRandom 用于 cryptographically-secure 随机性)。这将是您可以在应用程序中传递的内容。它的方法将是 numpy.randomrandom 模块中的函数,只有它们会有自己的状态(除非你明确地将它们设置为相等)。

最后,我并不是说这正是导致您出现问题的原因(由于看不到您的代码,我不得不做出一些推断),但这是一个很可能的原因。

任何questions/concerns请告诉我!