Распределение целых чисел с использованием весов? Как рассчитать?
Мне нужно распределить значение на основе некоторых весов. Например, если мои веса равны 1 и 2, то я ожидаю, что столбец с весом 2 будет иметь в два раза больше значения, чем столбец с весом 1.
У меня есть немного кода Python, чтобы продемонстрировать, что я пытаюсь сделать, и проблема:
def distribute(total, distribution):
distributed_total = []
for weight in distribution:
weight = float(weight)
p = weight/sum(distribution)
weighted_value = round(p*total)
distributed_total.append(weighted_value)
return distributed_total
for x in xrange(100):
d = distribute(x, (1,2,3))
if x != sum(d):
print x, sum(d), d
В приведенном выше коде показано много случаев, когда распределение значения приводит к тому, что сумма распределения отличается от исходного значения. Например, распределение 3 с весами (1,2,3) приводит к (1,1,2), что составляет 4.
Какой самый простой способ исправить этот алгоритм распределения?
ОБНОВИТЬ:
Я ожидаю, что распределенные значения будут целочисленными значениями. Неважно, как именно целые числа распределяются, если они составляют правильное значение, и они «максимально приближены» к правильному распределению.
(Под правильным распределением я подразумеваю нецелочисленное распределение, и я не полностью определил, что я имею в виду под «как можно ближе». Возможно, есть несколько допустимых выходных данных, если они составляют исходное значение.)