Задача:
Есть исходный набор данных в виде массива. Для каждого элемента массива указана вероятность его появления в результате.
Нужно написать функцию которая каждый раз при вызове будет возвращать один случайный элемент из массива с заданой вероятностью.
примеры применения:
- AB тестирование - есть 3 страницы которые должны показываться пользователям при заходе на сайт с вероятность 50%, 35% и 15% соответственно
- Словарь который будет показывать одно из слов содержащихся в памяти каждые 3 минуты. При этом новые слова будут показываться чаще чем старые.
Мне в голову приходит только решение в "лоб". УПРОЩЕННЫЙ вариант ниже (JavaScript):
function probabilityRandom(chanceA, chanceB, chanceC, items) {
var totalWeight = chanceA + chanceB + chanceC;
// generate random number in range from 1 to `totalWeight`
var tmp = 1 + (Math.random() * totalWeight);
if(0 < tmp && tmp <= chanceA){
return items[0];
}
if(chanceA < tmp && tmp <= chanceA + chanceB){
return items[0];
}
if(chanceA + chanceB < tmp && tmp <= chanceA + chanceB + chanceC){
return items[0];
}
}
probabilityRandom(50, 35, 15, ["first", "second", "third"]);
Собственно вопрос - есть ли какие либо алгоритмы для подобного вида задач, и как бы вы решали их?
приветствуются ссылки на статьи описывающие подобное, псевдокод и советы.
PS.