如何在 GCC 5 中为指数分布生成随机数
how to generate a random number for an exponential distribution in GCC 5
我想要一个指数分布来控制何时占用频道以及占用多长时间。我现在的代码使用 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;
如果你需要指数分布的数,就用对数变换
ed = -std::log(dis(gen));
如果您喜欢煮熟的溶液,请使用http://en.cppreference.com/w/cpp/numeric/random/exponential_distribution
将此代码移植到 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
和 return 它们。
你可以查看 std::random_device
的 msvc 版本,如果你想在 windows 上工作,也可以合并它...iirc 目前没有 mingw 实现,并且 windows 一个使用一些加密 API.
- 使用其他一些开源 rng 库。你可以看看 trng.
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 ();
我想要一个指数分布来控制何时占用频道以及占用多长时间。我现在的代码使用 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;
如果你需要指数分布的数,就用对数变换
ed = -std::log(dis(gen));
如果您喜欢煮熟的溶液,请使用http://en.cppreference.com/w/cpp/numeric/random/exponential_distribution
将此代码移植到 C++11 之前的版本时,我想到了一些想法:
使用增强功能。
Boostrandom_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
和 return 它们。
你可以查看 std::random_device
的 msvc 版本,如果你想在 windows 上工作,也可以合并它...iirc 目前没有 mingw 实现,并且 windows 一个使用一些加密 API.
- 使用其他一些开源 rng 库。你可以看看 trng.
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 ();