29

私は 27 要素の配列を持っていますが、配列のすべての順列を生成したくありません (27!)。5000 個のランダムに選択された順列が必要です。どんなヒントも役に立ちます...

4

6 に答える 6

41

1 つの順列を生成するrandom.shuffleには、結果のコピーを使用して保存します。この操作をループで繰り返し、そのたびに重複をチェックします (おそらく重複はありません)。結果セットに 5000 個のアイテムが含まれたら、停止します。

コメントのポイントに対処するために、Python のrandom モジュールはMersenne Twisterに基づいており、周期が2**19937-1よりもかなり大きい27!ため、使用に適しているはずです。

于 2010-01-23T19:17:12.077 に答える
12
import random

perm_list = []

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

print(perm_list)

10888869450418352160768000000 大きな数字が大好き!:)

10888869450418352160768000001プライムです!!

編集:

#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

警告: RNG が悪い場合、これは止まりません!

于 2010-01-23T19:16:25.833 に答える
6

itertools.permutations. これはジェネレーターであるため、順列のリスト全体を作成するわけではありません。5000になるまでランダムにスキップできます。

于 2010-01-23T19:14:14.800 に答える
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

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

jこれは、一致する値として、順列に Lehmer コードを使用します。

于 2010-07-13T21:59:20.587 に答える
1

itertools.permutations() 関数が必要な場合があります。その itertools モジュールが大好きです!

注: 2.6 の新機能

于 2010-01-23T19:14:54.813 に答える