我需要一个泊松分布。
目前我有以下代码:
public static int getPoisson(double lambda) {
double l = Math.exp(-lambda);
double p = 1.0;
int k = 0;
do {
k++;
p *= Math.random();
} while (p > l);
return k - 1;
}
我想知道如何修改代码,以便生成x个数值,这些数值都在一个定义范围内,例如,如果a = 5,b = 10,lambda = 6,则生成的所有值都将落在5到10的范围内。
注意:我可以重载方法,并接受范围参数,并在循环内调用getPossion方法;丢弃不适合此范围的任何内容。但是,我想检查是否有数学上定义的方法来实现这一点和/或这种方法是否合适。
编辑: 我丢弃"越界"值的方式:
public static int getPoisson(final double min, final double max, final double lambda) {
int k = 0;
do {
k = getPoisson(lambda);
} while (k < min || k > max);
return k;
}
probability
函数实现为泊松分布的概率密度函数。基本思想是将无限泊松分布替换为有限的“有界泊松分布”。我可以提供几个有用的链接: http://mathworld.wolfram.com/PoissonDistribution.html -- PDF公式https://github.com/apache/commons-rng/blob/master/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSampler.java -- 适用于非常大的均值的实现。如果必须使用泊松算法--你的代码很好。 - Nikolay