Python 中的键控随机洗牌

Keyed Random Shuffles in Python

我有一个列表 a=[num1,num2,...,numn]。我正在用 random.shuffle(a) 洗牌。然而,我想要的功能是洗牌算法将密钥作为输入,并且密钥的所有者确定性地产生相同的洗牌?

我想要一种算法,它将密钥、要打乱的元素序列作为输入,并根据密钥输出其随机排列。如果您再次应用随机播放并在相同的数据序列上输入相同的键,您将获得相同的结果。否则随机洗牌。相同数据上的相同键允许 "un-shuffle"

这可能吗?

在伪随机术语中,该密钥称为 种子,您可以在新的 random.Random() 实例上设置随机种子:

def keyed_shuffle(x, seed=None):
    random_obj = random.Random(seed)
    random_obj.shuffle(x)

您也可以直接使用 random.seed() and random.shuffle(),但是使用您自己的 random.Random() 实例可以避免在 random 模块使用的单例 random.Random() 实例上设置种子,因此不影响该模块的其他用途。

种子可以是整数(直接使用)或任何可散列的对象。

演示:

>>> a = [10, 50, 42, 193, 21, 88]
>>> keyed_shuffle(a)       # no seed
>>> a
[42, 10, 88, 21, 50, 193]
>>> a = [10, 50, 42, 193, 21, 88]
>>> keyed_shuffle(a)       # again no seed, different random result
>>> a
[88, 50, 193, 10, 42, 21]
>>> b = [10, 50, 42, 193, 21, 88]
>>> keyed_shuffle(b, 42)   # specific seed
>>> b
[193, 50, 42, 21, 10, 88]
>>> b = [10, 50, 42, 193, 21, 88]
>>> keyed_shuffle(b, 42)   # same seed used, same output
>>> b
[193, 50, 42, 21, 10, 88]
>>> c = [10, 50, 42, 193, 21, 88]
>>> keyed_shuffle(b, 81)   # different seed, different random order
>>> c
[10, 50, 88, 42, 193, 21]