質問

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

私は見つけました このページ これは、最後の段落で、次のように述べています。

ポアソン分布から採取した乱数のための単純なジェネレーターは、この簡単なレシピを使用して取得されます。1, 、 バツ2, 、...はゼロと1つの間の均一な分布を持つ乱数のシーケンスであり、Kは製品xが最初に整数である整数です1 ・ バツ2 ・ ... ・ バツK+1 <e

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

たとえば、二項乱数を考慮してください。二項乱数とは、1つのトスの頭の確率pを持つコインのnトスの頭の数です。間隔(0,1)でn均一な乱数を生成し、p未満の数をカウントすると、カウントはパラメーターnとpを持つ二項乱数です。

私はそれを行うライブラリがあることを知っていますが、私はそれらを使用することはできません、言語によって提供される標準的な均一な発電機のみ(この場合はJava)です。

役に立ちましたか?

解決

ポアソン分布

これがそうです ウィキペディアがクヌースがそれをするように言う方法:

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) luc devroye(私はリンクされていることがわかりました ウィキペディアの記事)これを与えます:

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)です。これらの値が通常どれだけ大きいか、ジェネレーターを呼び出す頻度に応じて、より良いアルゴリズムが必要になる場合があります。上記にリンクしている論文には、一定の時間で実行されるより複雑なアルゴリズムがありますが、読者の演習としてそれらの実装を残します。 :)

他のヒント

このおよびその他の数値の問題については、聖書は数値レシピの本です。

ここには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 = nepage&q =&f = false

CコードはJavaに簡単に転送できます。

この本は、多くの数値の問題について、金の重量である価値があります。上記のサイトでは、本の最新バージョンを購入することもできます。

KIPが投稿した回答は、到着率が少ないポアソンRV(Lambda)を生成するために完全に有効ですが、ウィキペディアに投稿された2番目のアルゴリズムは ポアソンランダム変数を生成します 数値の安定性により、より大きな到着率の方が適しています。

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

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

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

二項乱数に関しては、1988年の「二項ランダムバリエット生成」の論文に基づいています。最適化されたアルゴリズムを使用しているのでお勧めします。

よろしく

これをbuild.gradleに追加できます

implementation 'org.kie.modules:org-apache-commons-math:6.5.0.Final'

クラスを使用します Poissondistribution クラスのポイソンディストリビューションの詳細

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top