Создать случайное число с экспоненциальным распределением в c ++ (visual stduio)

Я пытаюсь создать случайное число с экспоненциальным распределением.
Когда я тестировал на простом примере, он работал хорошо.
Но когда я создаю его в своем проекте, он не работает. Мой проект включает в себя много классов с разными объектами.
Класс в моем проекте:

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
}

Может ли кто-нибудь помочь мне создать «время» с экспоненциально распределенным случайным числом.

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);
}

Случайные движки

Пожалуйста, используйте псевдослучайный генератор Мерсенна Твистера (std::mt19937 или же std::mt19937_64) вместо std::default_random_engine, Они могут обеспечить гораздо лучшие случайные числа. Увидеть это видео автором <random>,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]