问题描述
我正在处理发行问题。例如:我想调用一个函数,该函数应触发第二个函数。第二个功能可以是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);