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中的键控随机洗牌的主要内容,如果未能解决你的问题,请参考以下文章

如何随机洗牌一个数组

如何洗牌 List<T; 中的元素?

阵列随机洗牌,同时在树枝中有约 500 行

对 Spark 数据框中的行进行洗牌

防止 SwiftUI 中的数组重新洗牌

常用算法篇-洗牌算法