0

の 2 つまたは同じ値を持たないように、(x,y,z)Python で3 タプルを生成しようとしています。さらに、変数およびは、別々の範囲およびで定義できます。そのようなタプルを生成できるようにしたいと思います。明らかな方法の 1 つは、各変数を呼び出して、 . これを行うためのより効率的な方法はありますか?xyzxyz(0,p)(0,q)(0,r)nrandom.random()x=y=z

4

1 に答える 1

1

必要な要素を生成するジェネレーターを作成できます。たとえば、次のようになります。

def product_no_repeats(*args):
    for p in itertools.product(*args):
        if len(set(p)) == len(p):
            yield p

それに貯水池サンプリングを適用します。

def reservoir(it, k):
    ls = [next(it) for _ in range(k)]
    for i, x in enumerate(it, k + 1):
        j = random.randint(0, i)
        if j < k:
            ls[j] = x
    return ls

xs = range(0, 3)
ys = range(0, 4)
zs = range(0, 5)

size = 4

print reservoir(product_no_repeats(xs, ys, zs), size)
于 2012-10-11T09:45:14.197 に答える