这是我尝试在练习中解决的一个更大问题的一部分。它看起来像这样:
x出现的可能性是y 的10 倍。
z出现的频率比y少 2 倍。
我通过计算这样的单个单位解决了这个问题:
const x = 100;
const y = 10;
const z = 5;
const unit = 100 / (x + y + z);
单位等于 0.87 所以当我做 (0.87) + (0.87 * 10) + (0.87 * 5) 我得到 100%(几乎)
然后我生成一个介于 0 和 1 之间的随机数。
const randomNumber = Math.random();
function getValue() {
if (randomNumber <= 0.87) {
console.log('x');
} else if (randomNumber > 0.87 && randomNumber < 95.7) {
console.log('y');
} else console.log('z');
}
getValue();
如果 value<0.87 然后我注销 x,如果 value < 0.87+(0.087*10) 我 log y 等等
谁能推荐比这更合乎逻辑和优雅的方式?
除了randomNumber > 0.87
多余的事实外,你的方式对我来说看起来很干净。
如果要存储的值x
,y
并z
在一个数组,你也许可以写例如一些更清晰的代码:
let prob = [100, 10, 5];
let sum = prob.reduce((a, b) => a + b, 0);
let normalizedProb = prob.map(p => p / sum);
let cummulativeProb = normalizedProb.map((cummulative => p => cummulative += p)(0));
for (let i = 0; i <= 50; i++) {
let r = Math.random();
console.log(cummulativeProb.filter(p => r >= p).length);
}
此外,您可能想阅读这篇文章以更快地实现(尽管在 python 中)。但是,代码肯定会更复杂。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句