使用泊松分布生成特定范围内的随机数。

4

我需要一个泊松分布

目前我有以下代码:

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;
}
1个回答

0
如果您想在给定的概率下仅获取非常小的给定范围内的一些整数,并且使用固定(或很少更改)的lambda,最简单的方法是为每个数字保留概率表并进行偏向抽样。
以下是一些伪代码:
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
  }
}

或者使用别名方法来快速选择值。


这是什么算法? - Dan
提供“通过线性搜索从有限离散分布中伪随机数采样”的代码框架。 - Nikolay
很不幸,必须使用泊松算法。我会发布我目前正在使用的实现,以便您进行检查。 - Dan
如果必须使用泊松分布(且min、max和lambda一段时间内保持不变),则可以将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
那么,为了从泊松分布中生成一个值,我必须实现一个有界的概率密度函数算法吗?如果是这样,是否有任何可用的资源来实现这一点,或者我必须手动实现公式? - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接