2013-07-26 88 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%的底池,我認爲這不是你想要的:) –