2013-07-26 62 views
3

我在我的基于Web的应用程序中制作彩票系统,所以它在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% 

我相当糟糕,在数学和一些指针和/或代码段将帮助我解决这个问题很多。

编辑

从法比安斯基Roualdes解决方法:http://jsfiddle.net/LB8YU/1/

+0

你从哪里拿出22,18,14等...?这只是一个例子,你从头顶上做出的? – JayGee

+0

@JayGee我只是移动数字,直到我得到了100%的总数,所以是从我的头顶上 – MakuraYami

回答

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高,它已经很高,如果它等于1为5个获奖者。

+0

非常感谢我会尝试这个工作和测试结果,生病回到你身边! – MakuraYami

+0

尝试后好了,我发现自己缺乏正确使用它的知识。我错过了锅价值的来源,以及它如何分配100%的价值。结果并不接近我期望的http://jsfiddle.net/LB8YU/(检查控制台)我认为你的想法正是我所需要的,但它可能在JavaScript中有不同的作用,如果可以的话,我将不胜感激帮我解决这个:)谢谢。 – MakuraYami

+1

不,我测试了它,一切正常,并且您不必尝试删除科学记数法。但是... lambda = 10 ...你的问题在这里:试试lambda = 0.5。事实上_lambda将取决于获胜者的数量和分布的形状。对于5个lambda = 10的获胜者,第一个获胜者将拥有99%的底池,我认为这不是你想要的:) –