首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按定义的比率分配价值

按定义的比率分配价值
EN

Stack Overflow用户
提问于 2017-03-31 07:06:15
回答 3查看 507关注 0票数 7

我这里有一个场景。让我举个小例子来解释。

我有10支钢笔,我得给3个人。这些人的比例大约是6:6:1,意思是如果我给C人1支笔,我必须给A人和B人6-6支笔。

我试图用下面所述的简单计算来解决这个问题。

代码语言:javascript
复制
PerPersonPen = (TotalCountofPens * PerPersonRatio)/(SumofAllPersonsRatio) 

Person A =(Int) (10*6)/13 = 4
Person B = (Int) (10*6)/13 = 4
Person C = (Int) (10*1)/13 = 0

在这里,C人会得到0支钢笔,但这不应该发生。我希望那个人A&B得到4支钢笔,这是对的。但人C也应该得到一支剩下的笔。

这种情况发生在一个人与其他人相比有一个比率计数的情况下。

有人能帮我解决这个问题吗?或者我怎样才能做到呢?

EN

回答 3

Stack Overflow用户

发布于 2017-03-31 10:55:57

洛朗G在注释部分如何公平地舍入数字中给出了一个非常有用的Math链接

这篇文章暗示了以下算法:

  • 对于每个人,计算她应该得到的比率( x_i ) (x_i = her share/sum of shares)
  • C_min = numberOfPensC_max设置得足够大,以便sum_i (floor(x_i*C_max)) > numberOfPens (C_max = numberOfPens + 1/(min x_i)应该工作)
  • C_minC_max之间进行二分法搜索,直到找到一个C,比如sum_i (floor(x_i*C)) = numberOfPens

然而,当存在联系时,这可能不起作用(就像在您的示例中,其中两个比率为6/13)。但是,你可以做的是添加一个非常小的随机噪声(你加或减去你原来比率之间最小的非零间隙的一半)来打破你的比率,得到一个总体上的结果,这将是“几乎公平的”。

编辑:我注意到我最初选择的C_max是错误的,所以我把它修正到了一些有用的东西上。不过,我认为仍有改善的余地。在满足标准( C_max )之前,还可以通过在2^k numberOfPens中增加k来找到初始2^k numberOfPens

票数 1
EN

Stack Overflow用户

发布于 2017-03-31 10:07:49

在查看您的示例时,很明显,每个参与者至少应该得到您计算出来的结果。只有一些人会得到更多。

我建议采取以下措施:

  1. 计算出每一位预言家应该获得多少双倍。就像你没有演员一样。
  2. 减去所有人的总和(在我们的例子中是8)。
  3. 按尾数对人进行排序(在点值之后)。
  4. 对于第一个k个人,使用Math.Ceiling(assigned value),其中k是我们在示例的步骤2.10-8中计算出来的期望值和。
  5. 对于其他人,则使用常规的强制转换(如(int) (assigned value) )。
票数 0
EN

Stack Overflow用户

发布于 2017-03-31 08:17:25

有点像

代码语言:javascript
复制
int_weights = [6, 6, 1]
total_weights = sum(int_weights)

to_share = 10

still_to_share = to_share
left_weight_total = total_weights

shares = []
for weight in int_weights:
    s = int(0.5 + (float(still_to_share) * weight / left_weight_total))
    still_left -= s
    left_weight_total -= weight
    shares.append(s)

这给了相当但不是绝对的公平(这是不可能通过联系实现的,参见我在问题评论中的链接)。

代码语言:javascript
复制
shares

5、4、1

代码语言:javascript
复制
sum(shares)

如果您想实现公平的关系,最好的结果将是[4, 4, 2] (或[5, 5, 0] :auto_censored_but_not_totally:;-)?您可以通过排序和考虑以前的分配达到。直到我有了一个很好的理由来证明我是那么挑剔,我才会坚持这样的解决方案,如上面所示。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43134511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档