奇怪的Numpy随机混洗和种子

时间:2018-12-18 09:36:25

标签: python numpy random shuffle seed

我有一个关于随机数(特别是随机播放和种子)的问题。

'seed'用于生成相同的随机序列。

“随机播放”用于混排某些内容。

要以相同顺序随机排列两个列表,此代码可以正常工作:

idx = [1, 2, 3, 4, 5, 6]  
idx2 = [1, 2, 3, 4, 5, 6]  

seed = np.random.randint(0, 100000)  

np.random.seed(seed)  
np.random.shuffle(idx)  
np.random.seed(seed)  
np.random.shuffle(idx2)  

结果:

[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6]  
[5, 3, 1, 2, 4, 6] [5, 3, 1, 2, 4, 6]  
[1, 5, 3, 2, 4, 6] [1, 5, 3, 2, 4, 6]  
[2, 5, 3, 4, 6, 1] [2, 5, 3, 4, 6, 1]  
[2, 5, 6, 3, 4, 1] [2, 5, 6, 3, 4, 1]  
[4, 5, 6, 1, 2, 3] [4, 5, 6, 1, 2, 3]  

我可以检查一下此代码是否工作正常。

...省略

已解决,但问题不清楚。
重新定义简化版本中的问题:

idx = [1, 2, 3, 4, 5, 6]
for i in range(10):
    seed = np.random.randint(0, 10000)
    idx2 = [1, 2, 3, 4, 5, 6]
    np.random.seed(seed)
    np.random.shuffle(idx)
    np.random.seed(seed)
    np.random.shuffle(idx2)

然后,对于每次迭代,idx!= idx2都是清除的。
 -问题是这样的:为什么idx和idx2不相同?

但是,我没有注意到idx2的重新初始化。 (实际上,原始代码并非如此简单-每次迭代,idx2都会获得新的图像目录。-答案中的“ imlist”在简化版本中起着与idx2相同的作用。)

阅读@tel的评论后,我发现了问题。 -idx也应该重新初始化,或者只使用基于索引的改组。

固定版本

for i in range(10):
    seed = np.random.randint(0, 10000)
    idx2 = [1, 2, 3, 4, 5, 6]
    idx = [1, 2, 3, 4, 5, 6]
    np.random.seed(seed)
    np.random.shuffle(idx)
    np.random.seed(seed)
    np.random.shuffle(idx2)

然后,idx == idx2:是

1 个答案:

答案 0 :(得分:0)

因此,正如您所说,对imlist所做的更改似乎引起了混乱。 ix1ix2彼此继续保持同步变化,但是imlist的顺序在每个循环开始时都会刷新。例如,由于ix1imlist在大多数循环(除了第一个循环)的开始都以不同的顺序开始,所以毫无疑问,随机播放将以不同的顺序将它们置于随机种子。