如何在 GCC 5 中为指数分布生成随机数
how to generate a random number for an exponential distribution in GCC 5
我想要一个指数分布来控制何时占用通道以及占用多长时间。我现在的代码使用 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 之前,我想到了几个想法:
-
使用提升。
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
并返回它们。
如果你想在Windows上工作,你可以看看std::random_device
的msvc版本,也可以合并它......iirc 目前没有 mingw 实现,Windows One 使用一些加密 API。
- 使用其他一些开源 rng 库。你可以看看trng。
- 使用简单类型列表实现的指数编译时间.为什么
- 如何从组合指数中找到仓位
- 改变或缩放两个正态分布以具有特定的相关系数
- 如何创建没有特定定义的随机分布?uniform_int_distribution是从其他类继承的吗?
- 正在读取 obj 文件!(指数)
- C++:快速模块化指数
- 在C++不使用 POW 的情况下处理负指数
- 比较向量中的元素时所花费的时间呈指数级增长
- C++随机数分布传递给函数
- 如何将包含指数的 QString 转换为C++中的双倍?
- 将数字提高到一个巨大的指数
- 从转换后的容器元素创建离散分布
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 在 c++ 中创建具有指数分布的随机数(可视化标准)
- 生成属于指数分布的随机数
- 如何生成指数分布的随机数(带均值)
- 如何在 GCC 5 中为指数分布生成随机数
- C++指数分布模板类生成不精确的随机数
- NS2 数据包大小呈指数分布
- 使用boost c++为一组数据生成指数分布