Python中的键控随机洗牌
Posted
技术标签:
【中文标题】Python中的键控随机洗牌【英文标题】:Keyed Random Shuffles in Python 【发布时间】:2016-08-10 18:28:08 【问题描述】:我有一个列表a=[num1,num2,...,numn]
。我用random.shuffle(a)
改组它。但是,我想要的功能是将 shuffle 算法作为输入密钥,并且密钥的所有者确定性地产生相同的 shuffle?
我想要一种算法,它将键、要打乱的元素序列作为输入,并根据键输出其随机排列。如果您再次应用随机播放并在相同的数据序列上输入相同的键,您将获得相同的结果。否则随机洗牌。相同数据上的相同键允许“un-shuffle”
这可能吗?
【问题讨论】:
什么是“密钥所有者”? “确定性地产生相同的洗牌”是什么意思? 所以你想要一个非随机的随机数?你问的是这个吗? @Two-BitAlchemist。我想要一种算法,它将密钥、要打乱的元素序列作为输入,并根据密钥输出其随机排列。如果您再次应用随机播放并在相同的数据序列上输入相同的键,您将获得相同的结果。否则随机洗牌。相同数据上的相同键允许“un-shuffle” @curious: 所以你想设置 随机种子。创建一个random.Random(seed)
实例以保持种子独立,然后使用它与randominstance.shuffle(somelist)
混洗。相同的seed
将产生相同的随机顺序。
@curious:见random.seed(): What does it do?。
【参考方案1】:
在伪随机术语中,该密钥称为种子,您可以在新的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]
【讨论】:
以上是关于Python中的键控随机洗牌的主要内容,如果未能解决你的问题,请参考以下文章