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