【发布时间】:2019-09-27 09:19:22
【问题描述】:
我有一个作业要做,那就是:
根据以下概率从黄色、蓝色和红色中选择一种随机颜色: 黄色:3/7 蓝色:1/7 红色:3/7
我知道我可以通过以下方式解决这个问题: 【黄、黄、黄、蓝、红、红、红】 但我不认为这在编程上是好的,因为当我遇到概率时,我将不得不更改数组。
所以,我想我可以尝试一些类似重量的方法
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
但我得到了:
Yellow = 0.48
Blue = 0.03
Red = 0.48
有趣的是,代码在概率相等 (1/3, 1/3, 1/3) 或类似 (1/2, 1/2, 0) 时有效
谁能指出我做错了什么?
【问题讨论】:
-
Stackoverflow 为我推荐了这些帖子,stackoverflow.com/questions/49164635 有一个与我非常相似的问题,但它的答案总体上呈现了我丢弃的方法。
标签: javascript arrays random