11

平均が1に等しい指数分布の乱数を生成しようとしています。平均と標準偏差を使用して正規分布の乱数を取得する方法を知っています。で取得できますがnormal(mean, standard_deviation)、指数分布の乱数を取得する方法がわかりません。

誰でもこれで私を助けることができますか?

4

2 に答える 2

13

C ++ 11では、標準は実際にSTLで利用可能な指数分布の要件に準拠したRNGがあることを保証しており、オブジェクトタイプには非常にわかりやすい名前が付いています。

指数分布のランダムジェネレーターの平均は、式E[X] = 1 / lambda1によって計算されます。

std::exponential_distributionにはラムダを引数として取るコンストラクターがあるため、ラムダの値を計算してジェネレーターに渡すことで、ルールに従ってオブジェクトを簡単に作成できます。

std::exponential_distribution rng (1/1); // lambda = 1 / E[X]

脚注
1.en.wikipedia.orgによる-指数分布>平均、分散、モーメント、中央値


読み取り可能なASCIIチャートとしての分布

#include <iomanip>
#include <random>
#include <map>
#include <iostream>

int
main (int argc, char *argv[])
{
  double const exp_dist_mean   = 1;
  double const exp_dist_lambda = 1 / exp_dist_mean;

  std::random_device rd; 

  std::exponential_distribution<> rng (exp_dist_lambda);
  std::mt19937 rnd_gen (rd ());

  /* ... */

  std::map<int, int> result_set;

  for (int i =0; i < 100000; ++i)
    ++result_set[rng (rnd_gen) * 4]; 

  for (auto& v : result_set) {
    std::cout << std::setprecision (2) << std::fixed;

    std::cout << v.first/4.f << " - " << (v.first+1)/4.f << " -> ";
    std::cout << std::string (v.second/400, '.') << std::endl;

    if (v.second/400 == 0)
      break;
  }
}

0.00 - 0.25 -> ........................................................
0.25 - 0.50 -> ...........................................
0.50 - 0.75 -> .................................
0.75 - 1.00 -> .........................
1.00 - 1.25 -> ....................
1.25 - 1.50 -> ...............
1.50 - 1.75 -> ............
1.75 - 2.00 -> .........
2.00 - 2.25 -> .......
2.25 - 2.50 -> .....
2.50 - 2.75 -> ....
2.75 - 3.00 -> ...
3.00 - 3.25 -> ..
3.25 - 3.50 -> ..
3.50 - 3.75 -> .
3.75 - 4.00 -> .
4.00 - 4.25 -> .
4.25 - 4.50 -> 

于 2012-07-15T11:33:47.107 に答える
11

指数分布確率変数の生成は、次の方法で実行できます。

-ln(U)/lambda (where U~Uniform(0,1)). 

詳細については、このウィキペディアの記事を参照してください。

指数分布の場合:lamda = 1/mean、したがって、次のようになります。

myVar = -ln(U) * mean (where U~Uniform(0,1)). 
于 2012-07-15T11:33:39.383 に答える