// функция, которая вернет функцию, которая будет на основе указанных вероятностей вызывать одну из указанных функций
const randomFuncBuilder = items => {
const total = items.reduce((sum, item) => sum + item.rate, 0);
return () => {
const rand = Math.random() * total;
let sum = 0;
for(const {func, rate} of items) {
sum += rate;
if (sum >= rand) {
return func();
}
}
};
};
// список функций и некоторого абстрактного значения частоты вызова
// в данном случае диапазон не 0-100, а 0-150.
const funcArray = [
{
func: () => 1,
rate: 10
},
{
func: () => 2,
rate: 20
},
{
func: () => 3,
rate: 30
},
{
func: () => 4,
rate: 40
},
{
func: () => 5,
rate: 50
}
];
// сама готовая функция, которую надо вызывать
const randomFunc = randomFuncBuilder(funcArray);
// результаты будут тут
let res = [];
for(let i = 0; i < 100000; i++) {
res.push(randomFunc());
}
// подсчет результатов, соответствует числу вызовов функций
const count = res.reduce((acc, v) => {
acc[v] += 1;
return acc;
}, {
"1": 0,
"2": 0,
"3": 0,
"4": 0,
"5": 0,
});
// проверка результатов, считать вероятности умеет же? значит вопросов не возникнет.
const total = funcArray.reduce((sum, item) => sum + item.rate, 0);
console.log(count);
console.log({
"1": count[1] / 100000 * total,
"2": count[2] / 100000 * total,
"3": count[3] / 100000 * total,
"4": count[4] / 100000 * total,
"5": count[5] / 100000 * total,
});