我正在尝试使用指数分布创建随机数。 当我用一个简单的例子进行测试时,它运行良好。 但是当我在我的项目中创建它时,它不起作用。我的项目包括许多具有不同对象的类。 我项目中的一个课程:
User.h:
#include<iostream>
#include<queue>
#include<math.h>
#include<random>
#include"Packet.h"
using namespace std;
class User {
protected:
queue<Packet*> PacketList;
const double rnd = 1.0 / 100;
std::default_random_engine generator;
exponential_distribution<> packetArrivalRate(double); // it will be error if "packetArrivalRate(1.0/100)"
public:
void newPacket();
};
User.cpp:
#include"User.h";
exponential_distribution<> User::packetArrivalRate(double)
{
return exponential_distribution<>(rnd);
}
void User::newPacket()
{
Packet* p = new Packet;
PacketList.push(p);
double time = packetArrivalRate(generator); //this line is error
}
任何人都可以帮我创建&#34;时间&#34;具有指数分布的随机数。
答案 0 :(得分:0)
问题是,当函数需要packetArrivalRate
时,您调用generator
double
是参数。所述函数返回一个exponential_distribution<>
,它需要一个生成器来为你提供指数分布的数字。
解决这个问题的一个简单(而且非常丑陋)的方法是给packetArrivalRate
一个正确的参数(请注意,该参数完全被函数忽略,因此它的值并不重要),然后在返回值上调用operator()
:
double time = packetArrivalRate(0)(generator);
替代设计
更合理的方法是不要忽略参数,然后提供rnd
:
double time = packetArrivalRate(rnd)(generator);
并像这样定义packetArrivalRate
:
exponential_distribution<> User::packetArrivalRate(double lambda)
{
return exponential_distribution<>(lambda);
}
随机引擎
请使用Mersenne Twister伪随机生成器(std::mt19937
或std::mt19937_64
)代替std::default_random_engine
。它们可以提供更好的随机数。请<random>
的作者查看this video。