Мне нужно распределить значение, основанное на некоторых весах. Например, если мои весы равны 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.
Каков самый простой способ исправить этот алгоритм распределения?
UPDATE:
Я ожидаю, что распределенные значения быть целыми числами. Не имеет значения, как распределяются целые числа, пока они соответствуют правильному значению, и они «как можно ближе» к правильному распределению.
(По правильному распределению я имею в виду нецелое распределение, и я не полностью определил, что я подразумеваю под «как можно ближе». Возможно, имеется несколько допустимых выходов, если они суммируют исходное значение.)
Итак, какой желаемый выход для распределения 3 с весами (1,2,3)? – Avaris
Вы хотите вернуть значения с плавающей запятой или целое число? Какова ожидаемая ценность здесь? (1,1,1) или (0,1,2)? – ElKamina
Самый простой способ с учетом ваших неполных спецификаций: удалить «круглый». Если вам нужны целые результаты, во многих случаях нет точных решений. Какой результат вы хотите в этих случаях? – Patrick