出力シーケンスの値の順序を気にしない場合、リストの値の合計が 1 になる 5 つの値の組み合わせの数はかなり少ないです。ただし、提案した特定のケースでは、浮動小数点値には丸めの問題があるため、計算が少し複雑です。range(11)
一連の整数 (例: ) を使用し、合計が 10 になる組み合わせを見つけると、問題をより簡単に解決できます。次に、小数値が必要な場合は、結果の値を 10 で割るだけです。
とにかく、これは指定された値になるすべての可能なセットを生成するジェネレータです:
def picks(values, n, target):
if n == 1:
if target in values:
yield (target,)
return
for i, v in enumerate(values):
if v <= target:
for r in picks(values[i:], n-1, target-v):
yield (v,)+r
0 から 10 までの数字の結果は次のとおりです。
>>> for r in picks(range(11), 5, 10):
print(r)
(0, 0, 0, 0, 10)
(0, 0, 0, 1, 9)
(0, 0, 0, 2, 8)
(0, 0, 0, 3, 7)
(0, 0, 0, 4, 6)
(0, 0, 0, 5, 5)
(0, 0, 1, 1, 8)
(0, 0, 1, 2, 7)
(0, 0, 1, 3, 6)
(0, 0, 1, 4, 5)
(0, 0, 2, 2, 6)
(0, 0, 2, 3, 5)
(0, 0, 2, 4, 4)
(0, 0, 3, 3, 4)
(0, 1, 1, 1, 7)
(0, 1, 1, 2, 6)
(0, 1, 1, 3, 5)
(0, 1, 1, 4, 4)
(0, 1, 2, 2, 5)
(0, 1, 2, 3, 4)
(0, 1, 3, 3, 3)
(0, 2, 2, 2, 4)
(0, 2, 2, 3, 3)
(1, 1, 1, 1, 6)
(1, 1, 1, 2, 5)
(1, 1, 1, 3, 4)
(1, 1, 2, 2, 4)
(1, 1, 2, 3, 3)
(1, 2, 2, 2, 3)
(2, 2, 2, 2, 2)
それらの 1 つを ( でrandom.choice
) ランダムに選択できます。または、それらの多くを使用する予定があり、同じことを繰り返したくない場合は、 を使用してから繰り返すことができますrandom.shuffle
。
results = list(picks(range(11), 5, 10))
random.shuffle(results)
for r in results:
# do whatever you want with r