为什么 numpy RandomState 会给出不同的结果?

Why does numpy RandomState gives different results?

我不明白为什么

import numpy as np
rng = np.random.RandomState(42)
rng.randint(10, size=1)
np.random.RandomState(rng.randint(10, size=1)).randint(10, size=3)

>>> OUTPUT: array([8, 9, 3])

import numpy as np
np.random.RandomState(42).randint(10, size=1)
np.random.RandomState(np.random.RandomState(42).randint(10, size=1)).randint(10,size=3)
>>> OUTPUT: array([9, 3, 4])

有人可以解释一下区别吗?

阅读前请注意:请注意以下所有“随机”一词的实例均表示“伪随机”。

简单的答案是因为您对不同的调用和后续操作使用不同的种子。

在您提供的示例中

import numpy as np
rng = np.random.RandomState(42)
rng.randint(10, size=1) # This is the first time you are asking 'rng' for 'randint()' with seed 42 which will return 6. First Random Number.
np.random.RandomState(rng.randint(10, size=1)).randint(10, size=3) # This is the second time you are asking the same 'rng' for 'randint()' with seed 42 which will return 3. Second Random Number.

在您提供的第二个示例中,

import numpy as np
np.random.RandomState(42).randint(10, size=1) # this is the first np.random.RandomState(42).randint(), which is 6, same as above
np.random.RandomState(np.random.RandomState(42).randint(10, size=1)).randint(10,size=3) # this is still the first np.random.RandomState(42).randint() , which is 6 again, but it was 3 above

文档中声明的兼容性保证是这样的:

Compatibility Guarantee

使用固定种子的固定位生成器和使用相同参数对“RandomState”方法的一系列固定调用将始终产生相同的结果直至出现舍入误差,除非值不正确。 RandomState 被有效地冻结,并且只会接收 Numpy 内部变化所需的更新。为 Generator 保留更多实质性更改,包括算法改进。

表示当你使用相同的种子时,会提供相同系列的数字,即np.random.RandomState(42)的构造函数初始化后的第一个随机数总是6,第二个随机数总是只要您请求一个随机值,就为 3。

通过运行验证。

import numpy as np
rng = np.random.RandomState(42)
print(rng.randint(10, size=1)) # output is always [6]
print(rng.randint(10, size=1)) # output is always [3]

我希望这能回答你的问题。