如何将概率(均匀递增或递减线性分布)分配给值数组?

How do I assign a probability (uniform increasing or decreasing linear distribution) to a array of values?

Given X=[1,2,3,4,5,6,7,8,9,10] -- but X could be any length(N).

I want to achieve the following:

  1. I want to give the 1st value X[0], the highest probability.
  2. I want to give the 2nd value X[1], a lesser probability than X[0].
  3. I want to give the 3rd value X[2], a lesser probability than X[1].
  4. ...
  5. I want to give the Last value X[N], a lesser probability than X[N-1]

All probabilities should sum up to 1.

为了清晰起见,均匀概率分布 (1/(X.length)) 看起来像这样:

{1:0.1, 2:0.1, 3:0.1, 4:0.1, 5:0.1, 6:0.1, 7:0.1, 8:0.1, 9:0.1, 10:0.1,}

如果 javascript 中的可能解决方案会很棒。

最后一个元素的概率是 q,前一个元素的概率是 2*q,前一个元素的概率是 3*q ...,第一个元素的概率是 N*q

  q + 2 * q + 3 * q +...+(N-1)*q + N * q  = 1
  q * Sum(1...N) = 1
  q * N * (N + 1) / 2 = 1
  q = 2 / (N * (N + 1))

因此您可以找到任何序列长度的 q 并获得每个元素的概率。 N = 3

的示例
  q = 2 / (3 * 4) = 1/6

概率:

  3/6, 2/6, 1/6   Sum = 1

您可以对指数求和(所有值加一)并使用总和来计算概率。

对于反向分布,反转概率数组。

var add = (a, b) => a + b,
    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    sum = data.length * (data.length + 1) / 2,
    probability = data.map((_, i) => (i + 1) / sum),
    sumProbability = probability.reduce(add, 0);

console.log(probability);
console.log(sumProbability);