我想知道如何选择要基于百分比运行的功能。例如,function1()
可能有60%的运行机会,function2()
可能有30%的运行机会,而function3()
可能有10%的运行机会。
我正在用Javascript编写代码,但给出的任何代码都在Javascript中并不是必须的。
我将要使用3个以上的功能,并且还具有轻松修改百分比的能力。为了简单起见,我将其缩减为3个。
我考虑过将所有功能放在一个对象中
var funcs = {
'1-10': func3(){},
'11-40': func2(){},
'41-100: func1(){}
}
然后,我将生成一个1到100之间的随机数,在对象键之间循环,并根据随机生成的数字出现的范围运行该函数。在我看来,这似乎不对,为了调整百分比,要花太多的时间。另外,我觉得我正在重新发明轮子。
请有人建议一种更易管理且更优雅的方式来实现这一目标吗?
答案 0 :(得分:1)
首先想到的是使用某种加权随机数。谷歌搜索将我带到这个npm module上,也带我过去的stackoverflow答案: Generate A Weighted Random Number
基于该答案:
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.log(10)}, 0.3:function() {console.log(30)}, 0.6:function() {console.log(60)}});
使用小数加总为1,而不是百分比。