web-dev-qa-db-ja.com

分布に従って乱数を生成する

いくつかの分布に従って乱数を生成したいと思います。これどうやってするの?

18

入手した標準の乱数ジェネレーター(単純な変換後のCのRand()、多くの言語で同等)は、[0,1]の範囲にわたる一様分布のかなり良い近似です。それが必要な場合は、これで完了です。これを、やや広い整数範囲で生成された乱数に変換することも簡単です。

一様分布から正規分布への変換は 指数分布 と同様に すでにSOでカバーされています です。

[編集]: 三角分布 の場合、一様変数の変換は比較的簡単です(Cのようなもので):

double triangular(double a,double b,double c) {
   double U = Rand() / (double) Rand_MAX;
   double F = (c - a) / (b - a);
   if (U <= F)
      return a + sqrt(U * (b - a) * (c - a));
   else
      return b - sqrt((1 - U) * (b - a) * (b - c));
}

これは、ウィキペディアのページに記載されている数式を変換するだけです。他の人が欲しいなら、それは探し始める場所です。一般に、一様変数を使用して、必要な分布の 累積密度関数 の垂直軸上の点を選択し(連続であると仮定)、CDFを反転してランダム値を取得します。望ましい分布。

18
Donal Fellows

これを行う正しい方法は、分布をn-1個のバイナリ分布に分解することです。これは、次のようなディストリビューションがある場合です。

A: 0.05
B: 0.10
C: 0.10
D: 0.20
E: 0.55

それを4つのバイナリ分布に変換します。

1. A/E: 0.20/0.80
2. B/E: 0.40/0.60
3. C/E: 0.40/0.60
4. D/E: 0.80/0.20

N-1個の分布から均一に選択し、次に、それぞれがバイナリ分布にある場合、確率に基づいて1番目または2番目のシンボルを選択します。

このコードはここにあります

11
Rafael Baptista

逆変換サンプリング、棄却サンプリング、およびDevroyeによる本を検索できます " 不均一確率変量生成 "/SpringerVerlag 1986

4
dot hack

それは実際には配布に依存します。最も一般的な方法は次のとおりです。 P(X)を、分布に従って生成された乱数がX未満である確率とします。

まず、0と1の間で一様ランダムXを生成します。その後、P(Y) = XのようなYを見つけ、Yを出力します。バイナリ検索を使用してそのようなYを見つけることができます(P(X) is Xの増加関数)。

これはあまり効率的ではありませんが、P(X)を効率的に計算できる分布で機能します。

4
falagar

補間を使用して、離散ビンから浮動小数点/倍精度に変換できます。単純線形はうまく機能します。テーブルメモリが制限されている場合は、他の補間方法を使用できます。 -jlp

0
jlpayton