【发布时间】:2012-01-31 23:06:50
【问题描述】:
我需要根据一些权重分配一个值。例如,如果我的权重是 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
上面的代码显示了许多情况,其中分配一个值会导致分配的总和与原始值不同。例如,分配权重为 (1,2,3) 的 3 得到 (1,1,2),总计为 4。
修复此分布算法的最简单方法是什么?
更新:
我希望分布的值是整数值。整数的确切分布并不重要,只要它们总计为正确的值,并且它们“尽可能接近”正确的分布。
(正确分布是指非整数分布,我还没有完全定义“尽可能接近”的含义。可能有几个有效的输出,只要它们总计原始值。)
【问题讨论】:
-
那么,分配权重为 (1,2,3) 的 3 所需的输出是什么?
-
你想要浮点数还是整数值作为返回值?这里的期望值是多少? (1,1,1) 或 (0,1,2) ?
-
鉴于您的规格不完整,最简单的方法是:删除“圆形”。如果您需要整数结果,则在许多情况下没有精确的解决方案。在这些情况下你想要什么样的结果?
-
@Patrick:分配的金额必须是整数(美分、苹果、王国等),否则没有问题。主要标准是每个份额都应该足够接近“浮动”答案,没有参与者有投诉的理由。
-
我认为this question 和this one 可能与您的情况相关。特别是,这些相关问题中的第二个似乎在问几乎同样的事情。