如何在python中生成数组的排列?

use*_*522 26 python permutation

我有一个27个元素的数组,我不想生成数组的所有排列(27!)我需要5000个随机选择的排列,任何提示将是有用的...

Mar*_*ers 36

要生成一个排列,请使用random.shuffle并存储结果的副本.在循环中重复此操作,每次检查重复(尽管可能不会有任何重复).一旦结果集中有5000个项目,请停止.

为了解决评论中的要点,Python的随机模块基于Mersenne Twister并且具有一段2**19937-1相当大的周期,27!因此它应该适合您的使用.

  • +1,但请注意`random.shuffle`有一个严重的弱点:当_n_变大时,大多数RNG的周期小于排列的总数.这意味着几乎所有可能的大于_n_的排列都无法生成,所以这不是真正随机的. (4认同)
  • 的确,约翰.Python的随机生成器的周期为2**19937-1,但它可能已经足够好了.另一个挑剔是,对于真正的随机数,你需要一个真正的随机源(例如来自放射性衰变),Python的随机模块只提供伪随机数.但是在人们常说"随机"时,他们真正的意思是"伪随机",我认为这就是这里的海报所意味着的. (3认同)
  • +1 酷!这是一个大骰子,10888869450418352160768000000 面临其中任何一个出现的概率是 1/10888869450418352160768000000。复制不行!! (2认同)

Pra*_*are 11

import random

perm_list = []

for i in range(5000):
    temp = range(27)
    random.shuffle(temp)
    perm_list.append(temp)

print(perm_list)
Run Code Online (Sandbox Code Playgroud)

10888869450418352160768000000 我喜欢大数字!:)

10888869450418352160768000001 是PRIME !!

编辑:

#with duplicates check as suggested in the comment

perm_list = set()
while len(perm_list)<5000:
    temp = range(27)
    random.shuffle(temp)
    perm_list.add(tuple(temp)) # `tuple` because `list`s are not hashable. right Beni?

print perm_list
Run Code Online (Sandbox Code Playgroud)

警告:如果RNG不好,这种情况永远不会停止!


Cat*_*lus 6

itertools.permutations.它是一个生成器,因此它不会创建整个排列列表.你可以随机跳过,直到你有5000.

  • 这不是真正的"随机",因为`itertools`以定义的顺序创建它们,并且存在有限数量的排列.更好的方法是执行以下操作:(1)确定**有多少**排列(称这个数字为"N"),(2)然后在"0..N-"范围内生成5,000个不同的随机索引1`,(3)从itertools.permutations生成器中选择与这些索引相对应的排列. (2认同)

Dan*_* D. 6

# apermindex should be a number between 0 and factorial(len(alist))
def perm_given_index(alist, apermindex):
    for i in range(len(alist)-1):
        apermindex, j = divmod(apermindex, len(alist)-i)
        alist[i], alist[i+j] = alist[i+j], alist[i]
    return alist
Run Code Online (Sandbox Code Playgroud)

用法: perm_given_index(['a','b','c'], 3)

这使用 Lehmer 代码进行排列作为j匹配的值。