0

简单的例子,改变数组中的值不会aa改变结果np.random.uniform()

import numpy as np
np.random.seed(12345)
aa = np.array([3., 56., 7])
np.random.shuffle(aa)
print(np.random.uniform())

但是改变它的长度确实

import numpy as np
np.random.seed(12345)
aa = np.array([3., 56., 7, 0.])
np.random.shuffle(aa)
print(np.random.uniform())

我尝试检查源代码,但它的编写方式远远超出了我的 Python 技能。

4

1 回答 1

2

Python 使用一个伪随机数生成器,它产生一个确定的值序列。重新播种将产生完全相同的序列,但如果您使用不同的数量,您最终会出现在序列中的不同位置。

洗牌n项目调用随机数生成器n-1时间来确定将哪个其他元素交换到数组的每个位置。更大n意味着对 PRNG 的调用更多。由于您的较短数组少了 1 个项目,因此 PRNG 序列在两次洗牌结束时不同步 1。您可以通过为该场景生成两个随机数而不是一个随机数来确认这一点:

import numpy as np

MAX = 2**32
np.random.seed(12345)
aa = np.array([3., 56., 7, 0.])
np.random.shuffle(aa)
print('randint after shuffling 4 items')
print(np.random.randint(MAX))  # 561383553

print('\ntwo calls to randint after shuffling 3 items')
np.random.seed(12345)
bb = np.array([3., 56., 7])
np.random.shuffle(bb)
print(np.random.randint(MAX))  # 1358822685
print(np.random.randint(MAX))  # 561383553
于 2020-03-06T16:22:34.057 回答