根据下列可能性,从黄色,蓝色和红色中选择一种随机颜色: 黄色:3/7 蓝色:1/7 红色:3/7
我知道我可以使用以下方法解决此问题: [黄色,黄色,黄色,蓝色,红色,红色,红色] 但是我认为这在编程上不会很好,因为当我把握机会时,我将不得不更改数组。
所以,我想我可以尝试一些类似减肥的方法
await new Promise((resolve, reject) => {
return window.Office.context.mailbox.item.body.getAsync('text', (result) => {
if (result.status === 'succeeded') {
console.log(result.value);
return resolve(result.value);
} else {
console.error(result.error);
return reject(result.error);
}
})
})
我做了一个测试:
let yellow_probability = 3/7
let blue_probability = 1/7
let red_probability = 3/7
const colors = ['yellow', 'blue', 'red']
function pickPosition(yellow_probability, blue_probability, red_probability){
let yellow_weight = Math.random() * yellow_probability
let blue_weight = Math.random() * blue_probability
let red_weight = Math.random() * red_probability
let weights = [yellow_weight, blue_weight, red_weight]
let max_of_array = Math.max.apply(Math, weights);
pickedColor = weights.indexOf(max_of_array)
return pickedColor
}
pickedColorIndex = pickPosition(yellow_probability, blue_probability, red_probability)
pickedColor = colors[pickedColorIndex]
console.log(pickedColor)
我希望此测试输出类似:
let n=1000000;
let yellow=0, blue=0, red=0;
for (let i=0; i<n; i++) {
pickedColorIndex = pickPosition(yellow_probability, blue_probability, red_probability)
if (pickedColorIndex==0) yellow++
else if (pickedColorIndex==1) blue++
else red++;
}
console.log("yellow = " + yellow/n );
console.log("blue = " + blue/n );
console.log("red = " + red/n );
但是我得到了:
Yellow = 0.43
Blue = 0.14
Red = 0.43
有趣的是,当概率等于(1 / 3、1 / 3、1 / 3)或类似(1 / 2、1 / 2、0)时,代码才起作用
有人可以指出我在做什么错吗?
答案 0 :(得分:4)
您可以创建尽可能多的不同项目,而不是一个随机值,然后将其取为最大值。
这会提升具有较高因子/概率的值/项目。
代替这种方法,您可以采用一个随机值并将所有概率放入一个数组中,然后检查随机值的间隔时间。拿这个东西。
编辑:代码
function getRandomIndex(probabilities) {
var random = Math.random(),
i;
for (i = 0; i < probabilities.length; i++) {
if (random < probabilities[i]) return i;
random -= probabilities[i];
}
return probabilites.length - 1;
}
var probabilities = [3 / 7, 1 / 7, 3 / 7],
j = 1e6,
count = [0, 0, 0];
while (j--) count[getRandomIndex(probabilities)]++;
console.log(count);
答案 1 :(得分:0)
这类似于重复项中提到的方法。您创建一个比率与概率相同的数组。 (这里我使用2个小数位,并向数组中添加了约100个项目。您可以将乘法乘以更大的数字,并使用.toFixed(3)
来提高准确性)
function getRandomWithProbability(array) {
const filled = array.flatMap(([color, prob]) => {
const length = prob.toFixed(2) * 100;
return Array.from({ length }).fill(color)
});
const random = Math.floor(Math.random() * filled.length);
return filled[random]
}
const arr = [["yellow", 3/7], ["blue", 1/7], ["red", 3/7]]
console.log(getRandomWithProbability(arr))