import random
def getperm(l):
seed = sum(sum(a) for a in l)
random.seed(seed)
perm = list(range(len(l)))
random.shuffle(perm)
random.seed() # optional, in order to not impact other code based on random
return perm
def shuffle(l):
perm = getperm(l)
l[:] = [l[j] for j in perm]
def unshuffle(l):
perm = getperm(l)
res = [None] * len(l)
for i, j in enumerate(perm):
res[j] = l[i]
l[:] = res
我想你可以应用任何你喜欢的洗牌,只要你能种子你的随机来源。在
取一个数字从0到n的列表,然后洗牌。使用此列表的顺序来无序排列元组列表,例如,如果洗牌后列表的第一个元素是
5
,则无序排列的元组列表中的第一个元素是l[5]
。然后,您可以反其道而行之:无序排列的元组列表中的第一个元素是非缓冲元组列表中的第五个元素。在如果你可以用你的随机数列表中的0重新洗牌。在
编辑:trincot的答案实现了这个想法,但是使用了有效的示例代码。在
您可以选择某种算法来确定一个种子,该种子可以从列表本身派生而不依赖于其顺序。在
对于示例数据结构,种子可以是所有值的总和。然后用这个种子生成一个从0到n-1的随机(但具有确定性)排列。然后,该排列可作为洗牌和取消缓冲函数的基础:
示例调用:
^{pr2}$相关问题 更多 >
编程相关推荐