我需要一个Poisson distribution。
目前,我有以下代码:
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,和λ= 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;
}
如果您只希望得到一些整数在非常小的给定范围内与给定的概率固定(或很少改变)拉姆达最简单的方法就是保持概率表每个号码的和做的偏倚抽样。
一些伪代码:
public class BoundedSampler {
private final int min;
private final double[] table;
public BoundedSampler(int min, int max, double lambda) {
this.min = min;
this.table = new double[max - min + 1];
double cumulative = 0;
for(int x = min; x <= max; ++x) {
double prob = probability(x, lambda);
table[x - min] = cumulative + prob;
cumulative += prob;
}
for(int i = 0; i < table.length; ++i) {
table[i] /= cumulative;
}
}
public int sample() {
double r = Math.random();
for(int i = 0; i < table.length; ++i) {
if(table[i] <= r) {
return i + min;
}
}
return -1; // impossible: last table value == 1
}
}
或者使用alias method快速值选择。