22

私は周りを見てきましたが、それを行う方法がわかりません。

最後の段落で次のように述べているこのページを見つけました。

ポアソン分布から取得した乱数の単純なジェネレーターは、次の単純なレシピを使用して取得されます。 x 1、 x 2、... が 0 と 1 の間の一様分布を持つ乱数のシーケンスである場合、k は、積 x 1 · x 2 · ... · x k+1 < e

二項数を生成する方法を説明している別のページを見つけましたが、ポアソン生成の近似を使用していると思いますが、これは役に立ちません。

たとえば、二項乱数を考えてみましょう。二項乱数は、コインを N 回投げて表が出る回数であり、1 回の投げで表が出る確率は p です。区間 (0,1) で N 個の一様乱数を生成し、p 未満の数を数えると、その数はパラメーター N と p をもつ二項乱数になります。

それを行うためのライブラリがあることは知っていますが、それらを使用することはできません。言語 (この場合は Java) によって提供される標準の均一なジェネレーターのみです。

4

5 に答える 5

43

ポアソン分布

ウィキペディアがクヌースがそうするように言っている方法は次のとおりです。

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

二項分布

Luc Devroye によるNon-Uniform Random Variate Generation (PDF)の第 10 章(ウィキペディアの記事からリンクされていることがわかりました) を見ると、次のようになります。

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

ご注意ください

これらのアルゴリズムはどちらも最適ではありません。1 つ目は O(λ)、2 つ目は O(n) です。これらの値が通常どれくらい大きいか、およびジェネレーターを呼び出す必要がある頻度によっては、より優れたアルゴリズムが必要になる場合があります。上記のリンク先の論文には、一定時間で実行されるより複雑なアルゴリズムが含まれていますが、これらの実装は読者の演習として残しておきます。:)

于 2009-08-06T21:29:35.643 に答える
2

これと他の数値問題のために、聖書は数値レシピ本です。

ここにCの無料バージョンがあります:http ://www.nrbook.com/a/bookcpdf.php (プラグインが必要です)

または、Googleブックスで確認できます: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への転送が非常に簡単である必要があります。

この本は、多くの数値問題のために金でその重さの価値があります。上記のサイトでは、最新版の本を購入することもできます。

于 2009-08-07T08:34:28.127 に答える
2

Kip によって投稿された回答は、小さな到着率 (ラムダ) でポアソン RV を生成するのに完全に有効ですが、Wikipediaポアソン確率変数の生成に投稿された 2 番目のアルゴリズムは、数値的な安定性により、大きな到着率に適しています。

これにより、非常に高いラムダを持つポアソン RV の生成を必要とするプロジェクトの 1 つの実装中に問題に直面しました。だから私は別の方法を提案します。

于 2015-07-10T10:41:05.227 に答える
1

次のライブラリ(Javaコード)には、CERNからのいくつかの実装があります。

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

二項乱数については、1988年の論文「二項確率変数生成」に基づいており、最適化されたアルゴリズムを使用しているのでお勧めします。

よろしく

于 2010-01-26T09:53:26.107 に答える