我正在研究分配问题。例如:我要调用一个函数,这个函数应该触发第二个函数。第二个功能可以是 3(三)个选项之一。我想要:函数 A 应该有 10% 的时间被调用 函数 B 应该有 20% 的时间被调用 函数 C 应该有 70% 的时间被调用有 2 个选项 (70%-30%),很容易。我生成一个随机整数 Math.round(Math.random()*100),然后检查结果是否 < 30。结果 < 30 转到一个函数,其余的转到另一个函数,它平衡到 70/30。但是,当涉及到有两个以上的选项时,我遇到了逻辑问题。这是大纲: //Initialize variablesvar twentyPercentCount = 0;var seventyPercentCount = 0;var tenPercentCount = 0;//Iterate 10,000 timesfor (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: 943number of values less than 20: 94370 percent range: 8025**问题是 10% 和 20% 的桶仍然相等。我知道这是我的逻辑缺陷,但无法克服。
1 回答

开心每一天1111
TA贡献1836条经验 获得超13个赞
你可以把想要的分布的总和
[10, 20, 70] // distribution
[10, 30, 100] // totals
并检查随机值。
const
distribution = [10, 20, 70],
totals = distribution.map((s => v => s += v)(0));
count = [0, 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);
添加回答
举报
0/150
提交
取消