【问题标题】:Generate a random number within a range using a poisson distribution使用泊松分布生成一个范围内的随机数
【发布时间】:2019-07-03 18:18:47
【问题描述】:

我需要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 和 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;
}

【问题讨论】:

    标签: java math poisson


    【解决方案1】:

    如果您只想在给定概率和固定(或很少更改)的 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
      }
    }
    

    或使用alias method 快速选择值。

    【讨论】:

    • 这是什么算法?
    • 为“通过线性搜索从有限离散分布中进行伪随机数采样”提供的代码存根。
    • 不幸的是它必须是一个泊松算法。我将发布我正在使用的当前实现,以便您查看。
    • 如果一定要poisson distribution(并且min,max,lambda暂时固定),probability函数可以实现为PDF进行poission。基本思想是将无限泊松分布替换为有限的“有界泊松”。我可以提供几个有用的链接:mathworld.wolfram.com/PoissonDistribution.html -- PDF 公式 github.com/apache/commons-rng/blob/master/commons-rng-sampling/… -- 实现非常大的手段。如果它必须是 possion algorithm -- 你的代码很好。
    • 所以为了从泊松分布中生成一个值,我必须实现一个有界PDF算法吗?如果是这样,是否有任何资源可以实现这一点,或者我必须手动实现公式?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2016-01-31
    • 2013-05-02
    • 1970-01-01
    相关资源
    最近更新 更多