计算随机数出现的百分比

问题描述

我正在处理发行问题。例如:我想调用一个函数,该函数应触发第二个函数。第二个功能可以是3个(三个)选项之一。我想要: 函数A应该在10%的时间内被调用 函数B应该在20%的时间内被调用 函数C应该在70%的时间内被调用

有2个选项(70%-30%),非常简单。我生成一个随机整数Math.round(Math.random()* 100),然后检查结果是否

但是,在涉及两个以上的选择时,我遇到了逻辑问题。

这是大纲:

 //Initialize variables
var twentyPercentCount = 0;
var seventyPercentCount = 0;
var tenPercentCount = 0;
//Iterate 10,000 times
for (var i = 0; i < 10000; i++) {
  // generate whole integer 0-99
   // logic
}
console.log("number of times value is < 20:  " + twentyPercentCount);
console.log("number of times value is < 70:  " + seventyPercentCount);
console.log("remaining ten percent range:  " + tenPercentCount);

我目前正在尝试什么:

var twentyPercentCount = 0;
    var seventyPercentCount = 0;
    var tenPercentCount = 0;
    var distributionArray = [10,20,100];
    for (var i = 0; i < 10000; i++) {
      var rnd = Math.round(Math.random() * 100);
      // find first element > the random number
      let chosenNum = distributionArray.find((element) => element >= rnd);
      if (chosenNum == 100) {
        seventyPercentCount += 1;
      } else if (chosenNum == 20) {
        twentyPercentCount += 1;
      } else {
        tenPercentCount += 1;
      }
    }
    console.log("number of values less than 10:  " + twentyPercentCount);
    console.log("number of values less than 20:  " + twentyPercentCount);
    console.log("70 percent range:  " + seventyPercentCount);

结果

**number of values less than 10:  943
number of values less than 20:  943
70 percent range:  8025**

问题在于10%和20%的存储桶仍然相等。我知道这是我的逻辑缺陷,但无法克服。

解决方法

您可以获取所需分布的总和

[10,20,70] // distribution
[10,30,100] // totals

并检查随机值。

const
    distribution = [10,70],totals = distribution.map((s => v => s += v)(0));
    count = [0,0];

for (var i = 0; i < 10000; i++) {
  const
      rnd = Math.random() * 100,chosenNum = totals.findIndex(element => rnd < element);

  count[chosenNum]++;      
}

console.log(count);