javascript - 使用概率选择数组值

标签 javascript arrays random

我有一个作业要做,那就是:

从黄色、蓝色和红色中选择一种随机颜色,概率为: 黄色: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) 时,代码会起作用

谁能指出我做错了什么?

最佳答案

您不是使用单个随机值,而是创建尽可能多的不同项目,然后选择具有最大值的项目。

这会以更高的因子/概率提升值(value)/项目。

除了这种方法之外,您还可以采用单个随机值并将所有概率放入一个数组中,然后检查随机值所在的区间。拿走这个元素。


编辑:代码

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

关于javascript - 使用概率选择数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56061089/

相关文章:

javascript - 如何将元素附加到 iframe 表单?

javascript - jquery - 连续使用 .done() 给出与 .then()/.done() 相同的结果

javascript - 如何在hammer.js中将缩放焦点从图像中心更改为两次触摸的平均值

java - 类不读取数组

javascript - 从 Javascript 中的对象数组中获取对象

c# - .NET 随机数生成 - 自动种子

javascript - 一页上的多个数据表不起作用

c++ - 为什么我的程序最多只能编译 16 条记录?

algorithm - 以随机顺序生成整数序列,无需预先构建整个列表

c# - 如何让应用程序检查用户输入?