我想要一个指数分布来控制何时占用一个频道以及持续多长时间。我现在的代码使用的是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;
答案 0 :(得分:0)
如果您需要指数分布的数字,只需使用日志转换
ed = -std::log(dis(gen));
如果您更喜欢煮熟的解决方案,请使用http://en.cppreference.com/w/cpp/numeric/random/exponential_distribution
答案 1 :(得分:0)
将这段代码移植到C ++ 11之前,有一些想法可以想到:
使用提升。
Boost random_device
和boost::mt19937
应该与C ++ 11标准版本一样好用。 Boost也有自己的uniform_real_distribution
,这是标准内容的原型。
将实现带入树中 引入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
并返回它们。
你可以查看std::random_device
的msvc版本并将其合并,如果你想在windows上工作... iirc现在没有mingw实现,而windows使用了一些加密API。
答案 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 ();