彩票系统锅师

时间:2013-07-26 17:39:36

标签: javascript math formula division

我在基于网络的应用程序中制作了一个彩票系统,所以它是用JavaScript制作的,但我的问题更具数学性,所以可以随意用其他语言编写片段。

我希望以自然的感觉方式将彩票分发给获奖者,例如:

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%

我在数学上非常糟糕,一些指针和/或代码片段可以帮助我解决这个问题。

修改

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

1 个答案:

答案 0 :(得分:2)

我建议你使用指数分布:

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,则已经很高。