JS 反转概率

JS inverting probabilities

我正在生成对象网格,每个对象都有 3 种颜色中的一种。假设我正在填充一个特定的网格单元格。我知道在这个单元格周围有 1 个颜色为 0 的对象、1 个颜色为 1 的对象和 2 个颜色为 2 的对象,因此:

const surroundings = { 0: 1, 1: 1, 2: 2 }

现在我想为我正在使用的当前单元格指定一种颜色。我需要计算每种颜色的使用概率。为了让它看起来赏心悦目,我希望它更有可能与周围环境不同。所以在上面的例子中,概率可能是 { 0: 0.4, 1: 0.4, 2: 0.2 }.

我确定在概率论中有这种操作的实现,但我找不到正确的术语来表示它。在我给出的例子中,概率可能不同,因为我不知道如何计算它们。但是对于颜色 01 它们当然应该相等,对于颜色 2 它应该是最小的。

您可以获得 reciprocal 和 return 的一部分。

function getPro(array) {
    var inv = array.map(v => 1 / v),
        sum = inv.reduce((a, b) => a + b);
    return inv.map(v => v / sum);
}


console.log(getPro([1, 1, 2]));
console.log(getPro([1, 1, 1]));
console.log(getPro([2, 4, 6]));

我会使用周围频率的总和(通常是 4,除了网格边界)来得到倒数:

let surrounding = [1, 2, 1];
let sum = surrounding[0] + surrounding[1] + surrounding[2];
let inverted = [sum-surrounding[0], sum-surrounding[1], sum-surrounding[2]];
console.log(inverted);

// Pick a random color according to inverted probabilities:
let invSum = 2*sum;
let rnd = Math.floor(Math.random() * invSum);
let color = rnd < inverted[0] ? 0
          : rnd < inverted[0] + inverted[1] ? 1
          : 2;
console.log(color); 

当周围环境中根本没有出现特定颜色时,这也适用,例如 surrounding = { 0: 0, 1: 2, 2: 2 }