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]
我有一个列表 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]