Генерирует все возможные комбинации, которые в сумме равны 10, и выбирает случайную комбинацию
from itertools import product
from random import choice
n=10
m=5
finalList = choice([x for x in product(*[range(2*n/m+1)]*m) if sum(x) == 10])
Возможно, существует более эффективный способ, но при этом справедливо выбирается результат
ПозволяетПосмотрите, как это работает, когда n = 10 и m = 5
2*n/m+1 = 5
, поэтому выражение становится
finalList = choice([x for x in product(*[range(5)]*5) if sum(x) == 10])
`* [range (5)] * 5 использует распаковку аргумента.Это эквивалентно
finalList = choice([x for x in product(range(5),range(5),range(5),range(5),range(5)) if sum(x) == 10])
product()
дает декартово произведение параметров, которое в этом случае имеет 5 ** 5 элементов, но затем мы отфильтровываем те, которые не добавляют к 10,который оставляет список из 381 значений
choice()
используется для выбора случайного значения из результирующего списка