Python中的键控随机混乱

时间:2016-08-10 18:28:08

标签: python random shuffle

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

我想要一种算法,该算法将密钥,要洗牌的元素序列作为输入,并根据密钥输出其随机排列。如果再次应用shuffle并在同一数据序列上输入相同的键,则会得到相同的结果。否则随机随机播放。相同数据上的相同键允许“取消随机播放”

这可能吗?

1 个答案:

答案 0 :(得分:2)

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

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

您也可以直接使用random.seed()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]