Я хотел бы знать, как выбрать функцию для запуска на основе процента. Например, у function1()
может быть 60% шанс побежать, function2()
может быть 30% шанс побежать, а function3()
может быть 10% шанс побежать.
Я пишу это на Javascript, но не обязательно, чтобы какой-либо код был на Javascript.
Я хочу использовать более 3 функций, а также иметь возможность легко изменять проценты. Я просто сократил его до 3 для простоты.
Я думал о том, чтобы поместить все функции в объект:
var funcs = {
'1-10': func3(){},
'11-40': func2(){},
'41-100: func1(){}
}
Затем я генерировал случайное число от 1 до 100, циклически перебирал ключи объекта и запускал функцию на основе диапазона, в котором появляется случайно сгенерированное число. Это просто не кажется мне правильным, так как требует слишком много возни, чтобы настроить проценты. Кроме того, я чувствую, что заново изобретаю велосипед.
Пожалуйста, может кто-нибудь предложить более управляемый и элегантный способ добиться этого?
Первая мысль - использовать какой-то взвешенный рандом. Поиск в Google привел меня к этому нпм-модуль, а также к этому предыдущему ответу stackoverflow: Сгенерируйте взвешенное случайное число
Опираясь на этот ответ:
function weightedRand2(spec) {
var i, sum=0, r=Math.random();
Object.keys(spec).some(it => {
sum += parseFloat(it)
if (r <= sum) {
spec[it]()
return true
}
})
}
weightedRand2({0.1: function() {console.info(10)}, 0.3:function() {console.info(30)}, 0.6:function() {console.info(60)}});
При этом используются десятичные дроби с общей суммой 1, а не проценты.
Ааа, "взвешенное случайное число". Теперь это кажется таким очевидным. Я слышал этот термин раньше, и он полностью ускользнул от меня.