【问题标题】:Picking Array Values using Probability使用概率选择数组值
【发布时间】: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) 时有效

谁能指出我做错了什么?

【问题讨论】:

标签: javascript arrays random


【解决方案1】:

您可以创建尽可能多的不同项目,而不是单个随机值,然后再获取具有最大值的项目。

这会提升具有更高因素/概率的价值/项目。

您可以取单个随机值并将所有概率放入一个数组中,然后检查随机值的区间,而不是这种方法。拿走这个东西。


编辑:代码

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);

【讨论】:

  • 为什么不呢? :P 我敢肯定没有人会抱怨这一点
  • 但是,对于单个随机值,我不会面临一些等于概率的问题吗?例如:黄色和红色有 3/7 的概率,所以,如果我检查它们的随机值,它会冲突,不是吗?
  • 如果您可以添加一些代码,这将有助于理解您的方法。无论如何,我会尝试自己实现您的方法。
  • 还没有,我还没有电脑访问权限
【解决方案2】:

这类似于副本中提到的方法。您创建一个比率与概率相同的数组。 (这里我使用 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))

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2013-10-15
    • 2020-09-14
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    相关资源
    最近更新 更多