Лотерейная система

Я создал систему лотереи в своем веб-приложении, так что это делается на 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 ответ

Решение

Я предлагаю вам использовать экспоненциальное распределение:

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

Лямбда - это положительный параметр, который позволит вам выбрать форму распределения:

  • Если лямбда высока, у первых победителей будет большая часть банка;
  • Напротив, чем меньше лямбда, тем больше распределение будет стремиться к справедливому разделению банка.

Я надеюсь, что это поможет вам!

РЕДАКТИРОВАТЬ: Когда я говорю, что лямбда высокая, она уже высокая, если она равна 1 для 5 победителей.

Другие вопросы по тегам