抽样分布

Sampling distribution

假设我有一些由如下概率定义的分布 [0.1, 0.6, 0.2, 0.1]。概率之和等于1。我想知道如何对这个分布进行抽样,这样抽样就会服从分布。

假设 Node.JS 的 PRNG 遵循均匀分布,一个简单的解决方案可能是这个:

var v = Math.random(); // return a number between 0 and 1

if(v < 0.1)
    // first value
else if(v < 0.7) // (0.1 + 0.6)
    // second value
else if(v < 0.9) // (0.1 + 0.6 + 0.2)
    // third value
else
    // forth value

这里已经回答了这个问题(提出的解决方案更通用,因为他们提出了一个可以接受概率数组的函数): distributional sampling in Node.js

这取决于你的分布是离散的还是连续的。对于连续情况,您必须在两个值之间进行线性插值。这是伪代码

  1. u01之间的随机数
  2. i使得p[i] <= u <= p[i+1]
  3. Return (x[i+1] - x[i]) / (p[i+1] - p[i]) * (u - p[i]) + x[i]

请注意,在 2 中可能没有这样的 i,原因有二:(a) u < p[1] 或 (b) p[n] < u(我假设 1 为基础的数组)。案例(a) return x[1] 案例(b) x[n].