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

时间:2016-03-14 21:31:19

标签: c++ c++11 gcc random ns-3

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

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;

3 个答案:

答案 0 :(得分:0)

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

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

如果您更喜欢煮熟的解决方案,请使用http://en.cppreference.com/w/cpp/numeric/random/exponential_distribution

答案 1 :(得分:0)

将这段代码移植到C ++ 11之前,有一些想法可以想到:

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

  2. 将实现带入树中 引入mersenne Twister随机数发生器的论文包括发电机的参考实现。

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

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

    你可以查看std::random_device的msvc版本并将其合并,如果你想在windows上工作... iirc现在没有mingw实现,而windows使用了一些加密API。

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

答案 2 :(得分:0)

NS-3提供了一个Exponential Random变量,您可以从中获取所需的值。

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 ();