0

我正在尝试创建具有指数分布的随机数。当我用一个简单的例子进行测试时,它运行良好。但是当我在我的项目中创建它时,它不起作用。我的项目包括许多具有不同对象的类。我项目中的一个类:

用户.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();
};

用户.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
}

谁能帮我用指数分布的随机数创建“时间”。

4

1 回答 1

0

packetArrivalRate问题是generator当函数需要一个double. 所述函数返回 a 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::mt19937std::mt19937_64) 而不是std::default_random_engine. 它们可能会提供更好的随机数。看作者的这个视频<random>

于 2017-07-28T12:09:33.553 回答