使用内置 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)
时,它是 global。 numpy.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] 中的函数共享的种子=]模块。
在 numpy
和 random
中,如果您的 class 或应用程序想要拥有自己的状态,请从 numpy
创建 Generator
的实例或来自 random
的 Random
(或 SystemRandom
用于 cryptographically-secure 随机性)。这将是您可以在应用程序中传递的内容。它的方法将是 numpy.random
或 random
模块中的函数,只有它们会有自己的状态(除非你明确地将它们设置为相等)。
最后,我并不是说这正是导致您出现问题的原因(由于看不到您的代码,我不得不做出一些推断),但这是一个很可能的原因。
任何questions/concerns请告诉我!
我正在使用 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)
时,它是 global。 numpy.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] 中的函数共享的种子=]模块。
在 numpy
和 random
中,如果您的 class 或应用程序想要拥有自己的状态,请从 numpy
创建 Generator
的实例或来自 random
的 Random
(或 SystemRandom
用于 cryptographically-secure 随机性)。这将是您可以在应用程序中传递的内容。它的方法将是 numpy.random
或 random
模块中的函数,只有它们会有自己的状态(除非你明确地将它们设置为相等)。
最后,我并不是说这正是导致您出现问题的原因(由于看不到您的代码,我不得不做出一些推断),但这是一个很可能的原因。
任何questions/concerns请告诉我!