Python 与random.shuffle()相反?

Python 与random.shuffle()相反?,python,python-3.x,random,Python,Python 3.x,Random,我有一个函数,为了简单起见,我将它称为shuffler,它接受一个列表,给random一个seed 17,然后将该列表打印为shuffled def shuffler( n ): import random random.seed( 17 ) print( random.shuffle( n ) ) 我如何创建另一个名为unshuffler的函数来“unshuffler”shuffler()返回的列表,并将其返回到我输入到shuffler()中的列表(假设我知道种子)?使用相

我有一个函数,为了简单起见,我将它称为shuffler,它接受一个列表,给random一个seed 17,然后将该列表打印为shuffled

def shuffler( n ):
   import random
   random.seed( 17 )
   print( random.shuffle( n ) )

我如何创建另一个名为unshuffler的函数来“unshuffler”shuffler()返回的列表,并将其返回到我输入到shuffler()中的列表(假设我知道种子)?

使用相关种子对随机生成器重新设定种子,然后对列表1、2、…、n进行洗牌。这将准确地告诉您在洗牌过程中的最终位置。

这里有两个函数可以满足您的需要:

import random
import numpy as np

def shuffle_forward(l):
    order = range(len(l)); random.shuffle(order)
    return list(np.array(l)[order]), order

def shuffle_backward(l, order):
    l_out = [0] * len(l)
    for i, j in enumerate(order):
        l_out[j] = l[i]
    return l_out
示例

l = range(10000); random.shuffle(l)
l_shuf, order = shuffle_forward(l)
l_unshuffled  = shuffle_backward(l_shuf, order)

print l == l_unshuffled
#True

使用的是什么洗牌算法?你需要深入挖掘洗牌的本质来逆转它。或者保存一个数组的非缓冲副本,或者这是作弊?是的,这是作弊。我不知道怎么做,但是…我需要能够得到任何我知道种子的无序列表,我想你可能会在这里找到答案,但是有没有一个相反的字符串我可以用它来做相反的事情?无序索引告诉你第n项在无序列表中的位置。也就是说,Unshuffled[ShuffledIndex[I]]=Shuffled[I]。或者,您可以从该列表构建一个反向索引,如下所示:InverseIndex[ShuffledIndex[i]]=i。这使您可以将原始项目i检索为无序[InverseIndex[i]]。