Есть кое-что, чего я не понял. Я использую образец, данный из ссылки на cpp, для генерации чисел:
const int nrolls = 10; // number of experiments
std::default_random_engine generator;
std::poisson_distribution<int> distribution(4.1);
for (int i=0; i<nrolls; ++i){
int number = distribution(generator);
cout<<number<<" "<<endl;
}
(оригинальный код: http://www.cplusplus.com/reference/random/poisson_distribution/ )
Это выводит: 2 3 1 4 3 4 4 3 2 3 и так далее …
Прежде всего, что означают эти цифры? Я имею в виду, я должен суммировать их, чтобы создать время? Например:
2, (2 + 3) = 5, (5 + 1) = 6, (6 + 4) = 10, … и т. Д.
Во-вторых, мой настоящий вопрос заключается в том, что мне нужно производить как случайные поступления для сетевых пакетов, так и размер пакетов. Я имею в виду, когда пакеты приходят и если пакеты приходят, каков размер пакетов? Как я могу это сделать? Мне нужно что-то подобное:
http://i.hizliresim.com/dWmaGX.png
Значение «распределения Пуассона» и функция «std :: poisson_distribution ()» тесно связаны, но не совпадают.
Распределение Пуассона является дискретным распределением вероятностей. Вы можете рассчитать вероятности, например, вероятность того, что пакет не поступит в следующем периоде (например, одна секунда) равна 0,002, для одного пакета — 0,075, для двух пакетов — 0,15, для трех пакетов — 0,20 и т. Д., Когда среднее прибытие составляет 4. (значения вероятности, которые я использовал, являются образцами (не реальное значение))
Сумма вероятностей того, что для 0 пакетов до бесконечных пакетов станет 1,0 всегда.
std :: poisson_distribution () возвращает количество пакетов за каждый период, среднее из которых в длинных периодах равно среднему (4.1 в вашем коде), а их распределение — распределение Пуассона.
Вы можете рассчитать это, выполнив следующие действия.
Составьте таблицу из number_of_packet и вероятности.
Сделайте случайное число от 0 до 1.
Суммируйте вероятности в таблице, пока сумма не станет больше случайного числа.
(количество вероятностей, используемых для суммирования) -2 — это значение.
Пример: если вы получаете 0.3 как случайное число.
Сумма вероятностей отсутствия пакета для двух пакетов составляет 0,002 + 0,075 + 0,15 = 0,227 меньше 0,3.
Сумма вероятностей отсутствия пакета для трех пакетов составляет 0,002 + 0,075 + 0,15 + 0,20 = 0,427 больше 0,3.
Затем «два пакета» используется для следующего значения.
Это иллюстрация того, что произошло в std :: poisson_distribution ().
[Прямой ответ на ваш вопрос: Как сделать прибытие пакетов в распределении Пуассона]Я предполагаю, что период — одна секунда для легкого понимания.
выходы: 2 3 1 4 3 4 4 3 2 3, которые вы получили, это количество пакетов каждой секунды,
два пакета за первую секунду, три пакета за 2 секунды, один пакет за 3 секунды и т. д.
Вы можете сделать прибытие, размещая пакеты равномерно в эту секунду.
[Пример для выходов: 2 3 1]Время 0 с — 1 с
Два пакета приходит. Разделите 1 секунду на 2 (два периода 0,5 с) и поместите пакеты в середину из них. => 1-й пакет находится на 0,25 с, а 2-й на 0,75 с.
Время 1 с — 2 с
Терре пакеты прибывают. Разделите 1 секунду на 3 и поместите пакеты в середину из них. => 1-й пакет находится на 1.166 с, 2-й на 1.5 с, 3-й на 1.833.
…и так далее.
0.25, 0.75, 1.166, 1.5, 1.833 — это время прибытия первых пяти пакетов, которое получается из полученных «выходов: 2 3».
=====
Размер пакета — другая проблема.
Вы должны определить, какое распределение используется для размера пакета.
Я не думаю, что распределение Пуассона подходит для размера пакета.
Я боюсь, что способ, которым вы генерируете время прибытия через процесс Пуассона, не верен. Пуассоновский процесс не является распределением Пуассона.
Генерация времени прибытия через процесс Пуассона не означает использование распределения Пуассона, как вы делаете в своем коде. Это делается путем создания экспоненциального распределения на основе коэффициента пуассоновского прихода лямда.
Короче говоря, вам нужно сгенерировать экспоненциальное распределение со средним значением = 1 / лямда, см. Следующий пример:
#include <iostream>
#include <iterator>
#include <random>
int
main ()
{
// seed the RNG
std::random_device rd; // uniformly-distributed integer random number generator
std::mt19937 rng (rd ()); // mt19937: Pseudo-random number generation
double averageArrival = 15;
double lamda = 1 / averageArrival;
std::exponential_distribution<double> exp (lamda);
double sumArrivalTimes=0;
double newArrivalTime;for (int i = 0; i < 10; ++i)
{
newArrivalTime= exp.operator() (rng);// generates the next random number in the distribution
sumArrivalTimes = sumArrivalTimes + newArrivalTime;
std::cout << "newArrivalTime: " << newArrivalTime << " ,sumArrivalTimes: " << sumArrivalTimes << std::endl;
}
}
Результат выполнения этого кода:
newArrivalTime: 21.6419 ,sumArrivalTimes: 21.6419
newArrivalTime: 1.64205 ,sumArrivalTimes: 23.2839
newArrivalTime: 8.35292 ,sumArrivalTimes: 31.6368
newArrivalTime: 1.82962 ,sumArrivalTimes: 33.4665
newArrivalTime: 34.7628 ,sumArrivalTimes: 68.2292
newArrivalTime: 26.0752 ,sumArrivalTimes: 94.3045
newArrivalTime: 63.4728 ,sumArrivalTimes: 157.777
newArrivalTime: 3.22149 ,sumArrivalTimes: 160.999
newArrivalTime: 1.64637 ,sumArrivalTimes: 162.645
newArrivalTime: 13.8235 ,sumArrivalTimes: 176.469
Итак, на основе вашего эксперимента вы можете использовать: newArrivalTime или sumArrivalTimes.
ссылка: http://www.math.wsu.edu/faculty/genz/416/lect/l05-45.pdf