如何生成具有指数分布的随机数(带均值)?

Sad*_*tam 11 c++ exponential-distribution

我试图生成指数分布的随机数,均值等于1.我知道如何得到正态分布的随机数,具有均值和标准差.我们可以得到它normal(mean, standard_deviation),但我不知道如何获得指数分布的随机数.

谁能帮我这个?

Fil*_*efp 13

使用C++ 11,该标准实际上保证了存在遵循STL中可用的指数分布要求的RNG,并且对象类型具有非常具有描述性的名称.

指数分布随机生成器中的均值由公式E[X] = 1 / lambda1计算.

std::exponential_distribution有一个构造函数将lambda作为参数,因此我们可以通过计算lambda的值并将其传递给我们的生成器,轻松地按照规则创建一个对象.

std::exponential_distribution rng (1/1); // lambda = 1 / E[X]
Run Code Online (Sandbox Code Playgroud)

脚注
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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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 -> 
Run Code Online (Sandbox Code Playgroud)


ami*_*mit 11

生成指数分布随机变量可以通过以下方式完成:

-ln(U)/lambda (where U~Uniform(0,1)). 
Run Code Online (Sandbox Code Playgroud)

更多信息可以在这篇维基百科文章中找到

在指数分布:lamda = 1/mean,所以它得到你:

myVar = -ln(U) * mean (where U~Uniform(0,1)). 
Run Code Online (Sandbox Code Playgroud)

  • 在实践中你想要`(0,1)`而不是'[0,1]`,因为真正的RNG是离散的,而不是连续的.你真的不想从统一的RNG得到结果`1`(因此在你的"指数分布"中产生0),你*真的*不希望来自统一RNG的'0`. (2认同)
  • @SteveJessop:感谢您的纠正,因为我们不处理真正的连续分布,而只是模拟具有离散值的分布 - 您绝对正确. (2认同)
  • @ user4786271不,这是如何做到的算法解释.应该可以很容易地用任何语言实现 (2认同)