选择要根据百分比运行的函数

时间:2019-04-09 13:08:00

标签: language-agnostic

我想知道如何选择要基于百分比运行的功能。例如,function1()可能有60%的运行机会,function2()可能有30%的运行机会,而function3()可能有10%的运行机会。

我正在用Javascript编写代码,但给出的任何代码都在Javascript中并不是必须的。

我将要使用3个以上的功能,并且还具有轻松修改百分比的能力。为了简单起见,我将其缩减为3个。

我考虑过将所有功能放在一个对象中

var funcs = {
  '1-10':  func3(){},
  '11-40': func2(){},
  '41-100: func1(){}
}

然后,我将生成一个1到100之间的随机数,在对象键之间循环,并根据随机生成的数字出现的范围运行该函数。在我看来,这似乎不对,为了调整百分比,要花太多的时间。另外,我觉得我正在重新发明轮子。

请有人建议一种更易管理且更优雅的方式来实现这一目标吗?

1 个答案:

答案 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,而不是百分比。