別のアイデアがあります:組み合わせジェネレーターを保存し、すべてを消費するまでランダムに生成します。これにより、セットサイズの順序もランダム化されます。
編集:要素を合計するので、単一のセット内の要素の順序は気にしないと思います。そうした場合、random.shuffle(next_value)
利回りの前に置くことができます。
import itertools
import random
def random_powerset(l):
combs = [itertools.combinations(l,i) for i in range(len(l)+1)]
while combs:
comb_index = random.choice(range(len(combs)))
try:
next_value = next(combs[comb_index])
yield next_value
except StopIteration:
combs.pop(comb_index)
出力:
In : list(random_powerset(range(3)))
Out: [(0, 1), (0, 2), (0, 1, 2), (1, 2), (), (0,), (1,), (2,)]
In : list(random_powerset(range(3)))
Out: [(0, 1, 2), (0,), (), (0, 1), (1,), (0, 2), (1, 2), (2,)]
In : list(random_powerset(range(3)))
Out: [(0, 1), (0, 1, 2), (0, 2), (), (0,), (1,), (1, 2), (2,)]
In : list(random_powerset(range(3)))
Out: [(), (0,), (0, 1), (0, 1, 2), (1,), (0, 2), (2,), (1, 2)]
In : list(random_powerset(range(3)))
Out: [(), (0, 1), (0,), (0, 1, 2), (1,), (0, 2), (2,), (1, 2)]
In : list(random_powerset(range(3)))
Out: [(0, 1), (0,), (0, 2), (1, 2), (), (1,), (2,), (0, 1, 2)]
In : list(random_powerset(range(3)))
Out: [(), (0, 1, 2), (0,), (1,), (2,), (0, 1), (0, 2), (1, 2)]