假设我有一些由下列[0.1, 0.6, 0.2, 0.1]
概率定义的分布。概率之和等于1.我想知道如何对此分布进行采样,以便采样将遵循分布。
答案 0 :(得分: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 :(得分:1)
这取决于您的分布是离散的还是连续的。对于连续情况,您必须在两个值之间线性插值。这是伪代码
u
为0
和1
i
p[i] <= u <= p[i+1]
(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)在案例(b)x[1]
中返回x[n]
。