random.sample
を使用してランダムな組み合わせを生成し、複数の組み合わせを何度も生成しないようにセットを使用できます。ここには簡単なデモがあります。
from random import seed, sample
seed(42)
def random_combinations(seq, size, num):
combos = set()
while len(combos) < num:
item = sample(seq, size)
combos.add(tuple(item))
return list(combos)
# test
data = [
(0, 1), (2, 3), (4, 5), (6, 7), (8, 9),
(10, 11), (12, 13), (14, 15), (16, 17), (18, 19),
]
# Make 20 random 3-element combinations
combos = random_combinations(data, 3, 20)
for i, item in enumerate(combos, 1):
print('{:>2}: {}'.format(i, item))
出力
1: ((2, 3), (12, 13), (8, 9))
2: ((6, 7), (18, 19), (4, 5))
3: ((2, 3), (16, 17), (18, 19))
4: ((0, 1), (4, 5), (12, 13))
5: ((14, 15), (10, 11), (4, 5))
6: ((2, 3), (0, 1), (8, 9))
7: ((6, 7), (16, 17), (0, 1))
8: ((12, 13), (2, 3), (8, 9))
9: ((6, 7), (14, 15), (8, 9))
10: ((10, 11), (18, 19), (8, 9))
11: ((0, 1), (14, 15), (2, 3))
12: ((18, 19), (10, 11), (6, 7))
13: ((18, 19), (12, 13), (0, 1))
14: ((10, 11), (8, 9), (4, 5))
15: ((8, 9), (2, 3), (6, 7))
16: ((2, 3), (0, 1), (6, 7))
17: ((16, 17), (6, 7), (12, 13))
18: ((2, 3), (12, 13), (18, 19))
19: ((0, 1), (2, 3), (6, 7))
20: ((6, 7), (10, 11), (2, 3))
tobias_kコメントで述べたようにnum
は、組み合わせの総数に近すぎない場合、このコードは、適切です。 <の組み合わせの総数の50%が欲しい場合は、それでも問題はないが、それを超えると、既に生成されている組み合わせを再生成する可能性が高くなり、長い間ループする原因になります。このコードは異なる順序で、これら3対を含むタプル、例えば((2, 3), (8, 9), (12, 13))
は異なることが((2, 3), (12, 13), (8, 9))
を考慮することは
注意。
私たちは私たちのアイテムをセットにすることができますしたくない場合。これにはfrozenset
を使用する必要があります。これは、通常のセットは変更可能であり、したがってハッシュできないため、アイテムを設定できないからです。
from random import seed, sample
seed(42)
def random_combinations(seq, size, num):
combos = set()
while len(combos) < num:
item = sample(seq, size)
combos.add(frozenset(item))
return [tuple(u) for u in combos]
# test
data = [
(0, 1), (2, 3), (4, 5), (6, 7), (8, 9),
(10, 11), (12, 13), (14, 15), (16, 17), (18, 19),
]
# Make 20 random 3-element combinations
combos = random_combinations(data, 3, 20)
for i, item in enumerate(combos, 1):
print('{:>2}: {}'.format(i, item))
1: ((0, 1), (2, 3), (6, 7))
2: ((0, 1), (2, 3), (8, 9))
3: ((16, 17), (6, 7), (0, 1))
4: ((12, 13), (2, 3), (18, 19))
5: ((12, 13), (2, 3), (8, 9))
6: ((12, 13), (18, 19), (0, 1))
7: ((8, 9), (4, 5), (10, 11))
8: ((16, 17), (2, 3), (18, 19))
9: ((8, 9), (6, 7), (14, 15))
10: ((0, 1), (4, 5), (12, 13))
11: ((8, 9), (10, 11), (18, 19))
12: ((10, 11), (6, 7), (2, 3))
13: ((0, 1), (14, 15), (2, 3))
14: ((10, 11), (18, 19), (6, 7))
15: ((8, 9), (2, 3), (6, 7))
16: ((4, 5), (6, 7), (18, 19))
17: ((8, 9), (4, 5), (2, 3))
18: ((16, 17), (4, 5), (6, 7))
19: ((16, 17), (6, 7), (12, 13))
20: ((4, 5), (10, 11), (14, 15))
のように私の問題を解決するのはなぜな組み合わせの10%が発見された後に反復を停止していませんか?私は明らかにここで問題を見ていない...あなたはさらに詳しく説明できますか? –
最初の10%?あなたの質問は完全に明確ではありません。 –
わずか3にしたい私はDCBA ABCD ABDCあるACBD ACDB ADBC ADCB BACD badc BDAC BDCA BCAD BCDA CABD CADB CBAD CBDA CDAB cdba DABC DACB DBAC DBCA DCAB 4でABCDのすべての組み合わせに対して意味が、私はいけないが、callculsteすべてのIを行いたいですどのbadc bdac bdcaとorderemだけをインポートするのではない –