【发布时间】:2019-05-31 16:44:10
【问题描述】:
假设我有一个任意长度的 Python 列表k。现在,假设我想要一个随机样本 n ,(其中 n distinct 排列。我很想尝试:
import random
import itertools
k = 6
n = 10
mylist = list(range(0, k))
j = random.sample(list(itertools.permutations(mylist)), n)
for i in j:
print(i)
但是,当k 变得太大时,这段代码自然会变得非常慢。鉴于与排列总数相比,我可能正在寻找的排列数量 n 将相对较小,因此无需计算所有排列。然而,重要的是最终列表中的所有排列都不是重复的。
您将如何更有效地实现这一目标?请记住,mylist 可以是任何内容的列表,为了简单起见,我只是使用了list(range(0, k))。
【问题讨论】:
-
这个问题简化为能够生成第 n 个字典排列。一旦能够做到这一点,您就可以创建从序列
1 to n(其中 n 是排列的总数)到所有排列的映射。现在我们可以轻松地生成数字1 to n的随机样本S,然后为i 中的所有i 单独生成ith 排列i>S.
标签: python python-3.x random permutation discrete-mathematics