Python 与random.shuffle()相反?
我有一个函数,为了简单起见,我将它称为shuffler,它接受一个列表,给random一个seed 17,然后将该列表打印为shuffledPython 与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()中的列表(假设我知道种子)?使用相
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]]。