算法生成泊松和二项随机号码?(Algorithm to generate Poisson and b

2019-06-18 04:10发布

我一直在四处寻找,但我不知道该怎么做。

我找到了这个网页 ,其在最后一段,他说:

我已经找到了另一页描述如何生成二项分布的数字,但我认为这是使用泊松产生,这不利于我的近似值。

我知道有库,做到这一点,但我不能使用它们,只有通过语言提供的(Java的,在这种情况下)标准统一的发电机。

Answer 1:

泊松分布

下面是维基百科说,克努特说,这样做 :

init:
     Let L ← e^(−λ), k ← 0 and p ← 1.
do:
     k ← k + 1.
     Generate uniform random number u in [0,1] and let p ← p × u.
while p > L.
return k − 1.

在Java中,这将是:

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;
}

二项分布

按第10章展望 (PDF)由吕克·德夫罗伊(我发现从链接维基百科文章 )给出了这样的:

public static int getBinomial(int n, double p) {
  int x = 0;
  for(int i = 0; i < n; i++) {
    if(Math.random() < p)
      x++;
  }
  return x;
}

请注意

无论这些算法是最优的。 第一个是O(λ),第二为O(n)。 根据这些值通常有多大,以及如何经常需要调用发电机,你可能需要一个更好的算法。 本文我上面的链接有在固定时间内运行更复杂的算法,但我会离开的实现作为一个练习留给读者。 :)



Answer 2:

这和其他数值问题,圣经是数字食谱书。

有对C的免费版本在这里: http://www.nrbook.com/a/bookcpdf.php (所需的插件)

或者,你可以看到它在谷歌图书: http://books.google.co.uk/books?id=4t-sybVuoqoC&lpg=PP1&ots=5IhMINLhHo&dq=numerical%20recipes%20in%20c&pg=PP1#v=onepage&q=&f=false

C代码应该是很容易转移到Java。

这本书是值得的体重在黄金地段的数值问题。 在上述网站,您也可以购买最新版的书。



Answer 3:

虽然发表硖答案是完全有效的与到达的小率(波长),第二算法在维基百科上贴出产生泊松房车生成泊松随机变量是较大到达的速度更好地因数值稳定性。

我需要执行具有非常高的λ代泊松RV的项目之一的过程中,由于这个问题面临。 因此,我建议的其他方式。



Answer 4:

有来自CERN几种实现在以下库中(Java代码):

http://acs.lbl.gov/~hoschek/colt/

关于二项式随机数,它是根据1988年“二项随机变量的一代”的文件,那我向你推荐,因为它们使用的优化算法。

问候



文章来源: Algorithm to generate Poisson and binomial random numbers?