random.shuffle()的逆?

时间:2014-10-26 20:23:49

标签: python python-3.x random

我有一个函数,为了简单起见,我将它称为shuffler,它需要一个列表,随机提供一个种子17,然后打印那个洗牌的列表。

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

我如何创建另一个名为unshuffler的函数" unshuffles" shuffler()返回的那个列表,把它带回我输入shuffler()的列表,假设我知道种子?

3 个答案:

答案 0 :(得分:3)

使用有问题的种子重新组织随机生成器,然后将列表1,2,...,n洗牌。这告诉你到底是什么结果在洗牌中。

答案 1 :(得分:0)

以下两个功能可满足您的需求:

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

答案 2 :(得分:0)

在 Python3 中:

import random
import numpy as np

def shuffle_forward(l):
    order = list(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