import epsilon from "./epsilon.js";
/**
* [泊松分布](http://en.wikipedia.org/wiki/Poisson_distribution)是离散概率分布,
* 表示在固定时间/空间间隔内事件发生次数的概率,当事件以已知平均速率独立发生时适用。
* 其特征由严格正数的平均到达率(发生率)`λ`决定。
*
* @param {number} lambda 泊松分布参数(事件平均发生率)
* @returns {number[]} 泊松分布概率值数组
*/
function poissonDistribution(lambda) /*: ?number[] */ {
// 参数有效性验证:λ必须为严格正数
if (lambda <= 0) {
return undefined;
}
// 当前计算的位置(事件发生次数)
let x = 0;
// 累积概率跟踪(用于确定计算停止条件)
let cumulativeProbability = 0;
// 存储概率值的数组
const cells = [];
// 当前x值的阶乘缓存
let factorialX = 1;
// 迭代计算每个可能结果,直到累积概率接近1时停止
do {
// 计算当前x值的[概率质量函数](https://en.wikipedia.org/wiki/Probability_mass_function)
cells[x] = (Math.exp(-lambda) * Math.pow(lambda, x)) / factorialX;
cumulativeProbability += cells[x];
x++;
factorialX *= x; // 更新阶乘值:x! = (x-1)! * x
// 当累积概率接近1-ε时停止计算(ε为极小值)
} while (cumulativeProbability < 1 - epsilon);
return cells;
}
export default poissonDistribution;