如何在 GCC 5 中为指数分布生成随机数

how to generate a random number for an exponential distribution in GCC 5

本文关键字:分布 指数 随机数 GCC      更新时间:2023-10-16

我想要一个指数分布来控制何时占用通道以及占用多长时间。我现在的代码使用 C++ 11,与 ns3 不兼容。我想知道是否有一种方法可以生成与 ns5 使用的 c++ 3 编译器兼容的随机数。当前代码为

std::random_device rd;
std::mt19937 gen(rd());
//std::uniform_real_distribution<> dis(1, std::numeric_limits<int>::max());
std::uniform_real_distribution<> dis(0,1);
long double length = log(1-dis(gen))/(-0.25);
std::cout<<length<<std::endl;

NS-3 提供了一个指数随机变量,您可以从中获取所需的值。

double mean = 3.14;
double bound = 0.0;
Ptr<ExponentialRandomVariable> x = CreateObject<ExponentialRandomVariable> ();
x->SetAttribute ("Mean", DoubleValue (mean));
x->SetAttribute ("Bound", DoubleValue (bound));
// The expected value for the mean of the values returned by an
// exponentially distributed random variable is equal to mean.
double value = x->GetValue ();

如果您需要指数分布的数字,只需使用日志转换

ed = -std::log(dis(gen));

如果您喜欢煮熟的溶液,请使用 http://en.cppreference.com/w/cpp/numeric/random/exponential_distribution

将这段代码移植到 C++11 之前,我想到了几个想法:

  1. 使用提升。
    Boost random_deviceboost::mt19937 应该与 C++11 标准版本一样好。Boost也有自己的uniform_real_distribution,这是标准东西的原型。

  2. 将实现置于树中。
    介绍Mersenne Twister随机数生成器的论文包括生成器的参考实现。

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/ARTICLES/mt.pdf

如果您主要对网络测试感兴趣,您可能不关心跨平台(特别是在Windows上工作)。std::random_device的libc++实现只有大约十几行代码,它所做的只是/dev/random作为文件打开,reinterpret_cast从该文件中读取uint32_t并返回它们。

如果你想在Windows上工作,你可以看看std::random_device的msvc版本,也可以合并它......iirc 目前没有 mingw 实现,Windows One 使用一些加密 API。

  1. 使用其他一些开源 rng 库。你可以看看trng。