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

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

Пользователь.ч:

#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
}

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


person nguyennd    schedule 28.07.2017    source источник
comment
Какую ошибку вы получаете?   -  person NathanOliver    schedule 28.07.2017
comment
packageArrivalRate ожидает двойной, вы даете генератор. Он возвращает экспоненциальное_распределение‹›, вы получаете двойное.   -  person    schedule 28.07.2017
comment
это не работает. Обратитесь в Справочный центр: Вопросы, требующие помощи по отладке (почему этот код не работает?), должны включать желаемое поведение, конкретная проблема или ошибка и кратчайший код, необходимый для ее воспроизведения в самом вопросе. Вопросы без четкой формулировки проблемы бесполезны для других читателей. См. раздел Как создать минимальный, полный и проверяемый пример.   -  person underscore_d    schedule 28.07.2017
comment
Трудно предлагать решения, когда формулировка проблемы проста: она не работает. Пожалуйста, отредактируйте свой вопрос, чтобы дать более полное описание того, что вы ожидали, и чем это отличается от фактических результатов. См. раздел Как спросить, чтобы узнать, что является хорошим объяснением.   -  person Toby Speight    schedule 28.07.2017
comment
@ sasuke0o01 Вы используете rnd, хотя он не объявлен. Кажется, должно быть exponential_distribution<> User::packetArrivalRate(double rnd).   -  person Shafi    schedule 28.07.2017


Ответы (1)


Проблема в том, что вы вызываете packetArrivalRate с параметром generatorare, когда функция ожидает 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>.

person Jonas    schedule 28.07.2017
comment
Спасибо, но это все еще не работает. мой рнд это лямбда - person nguyennd; 29.07.2017
comment
Что вы имеете в виду под все еще не работает? Он прекрасно компилируется и предоставляет экспоненциально распределенные числа. - person Jonas; 29.07.2017