【问题标题】:lottery system pot division彩票系统彩池事业部
【发布时间】:2013-07-26 17:39:35
【问题描述】:

我在基于 Web 的应用程序中制作了一个彩票系统,所以它是用 JavaScript 编写的,但我的问题更数学化,所以请随意用其他语言编写 sn-ps。

我想以一种自然的方式将彩票奖池分配给中奖者,例如:

var pot = 1000;
var tickets = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
tickets = shuffleArray(tickets); //shuffle tickets for winners
//first half wins something (2 should be changeable)
var winners_count = Math.ceil(tickets.length / 2);

在这种情况下,我需要一种方法将整个底池分配给 10 名获胜者,其中第一名获得最多,最后一名(第 10 名)获得最少。

for(var i=0; i<winners_count; i++){
    var ticket = tickets[i];
    //formula to determine percentage of pot to gain needed.
}

示例结果:(只是为了告诉你它需要去哪里,而不是实际匹配)

1 - 22%
2 - 18%
3 - 14%
4 - 12%
5 - 10%
6 - 8%
7 - 7%
8 - 5%
9 - 3%
10 - 1%

我的数学很差,一些指针和/或代码 sn-ps 对我解决这个问题有很大帮助。

编辑

来自 Fabien Roualdes 的解决方案:http://jsfiddle.net/LB8YU/1/

【问题讨论】:

  • 22、18、14 等……是从哪里得出的?这只是你脑补的例子吗?
  • @JayGee 我只是在数字附近移动,直到我得到 100% 的总数,所以是的,就在我的头顶

标签: javascript math formula division


【解决方案1】:

我建议你使用指数分布:

for(i=0 ; i<nrWinners ; i++){
    value = exp(-lambda*i);
    distribution[i] = value;
    sum += value;
}
for(i=0 ; i<nrWinners ; i++){
    distribution[i] /= sum;  
}

Lambda 是一个正参数,可让您选择分布的形状:

  • 如果 lambda 很高,那么第一批获胜者将获得很大一部分底池;
  • 相反,lambda 越小,分配越倾向于公平分配底池。

希望对你有帮助!

编辑:当我说 lambda 很高时,如果 5 个获胜者等于 1,它就已经很高了。

【讨论】:

  • 非常感谢,我会努力解决这个问题并测试结果,我会尽快回复您!
  • 好吧,试过之后发现自己缺乏正确使用它的知识。我错过了底池价值的来源,以及它如何分配 100% 的底池价值。并且结果甚至与我所期望的jsfiddle.net/LB8YU (检查控制台)并不接近.
  • 不,我测试过,一切正常,您不必尝试删除科学记数法。但是... lambda=10... 您的问题就在这里:尝试使用 lambda=0.5。事实上 lambda 将取决于获胜者的数量和分布的形状。对于 lambda=10 的 5 名获胜者,第一个获胜者将拥有 99% 的底池,我认为这不是你想要的 :)
猜你喜欢
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2020-12-14
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多