我有一个列表a=[num1,num2,...,numn]
。我用random.shuffle(a)
改组它。然而,我想要的功能是将shuffle算法作为输入键,并且键的所有者确定性地产生相同的shuffle?
我想要一种算法,该算法将密钥,要洗牌的元素序列作为输入,并根据密钥输出其随机排列。如果再次应用shuffle并在同一数据序列上输入相同的键,则会得到相同的结果。否则随机随机播放。相同数据上的相同键允许“取消随机播放”
这可能吗?
答案 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]