Генерация случайных поступлений через процесс Пуассона С++

Я что-то не понял. Я использую образец, приведенный в ссылке 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


person WhoCares    schedule 29.01.2015    source источник
comment
Что вы имеете в виду под тем, что они означают? Это просто числа, выбранные из распределения Пуассона.   -  person Oliver Charlesworth    schedule 30.01.2015
comment
@OliverCharlesworth Я имею в виду, что они не похожи на числа для определения времени прибытия? Что мне не хватает?   -  person WhoCares    schedule 30.01.2015
comment
это не пример из справочника cpp, это пример с cplusplus.com. пример cppreference здесь   -  person Cubbi    schedule 30.01.2015


Ответы (2)


[Объяснение распределения Пуассона, которое может помочь вам лучше понять]

Значение «распределения Пуассона» и функции «std::poisson_distribution()» тесно связаны, но не совпадают.

Распределение Пуассона — это дискретное распределение вероятностей. Вы можете рассчитать вероятности, такие как вероятность того, что пакет не придет в следующий период (например, одна секунда) равен 0,002, один пакет равен 0,075, два пакета равен 0,15, три пакета равен 0,20 и т. д., когда среднее время прибытия равно 4. (значения вероятности, которые я использовал, являются образцами (не реальными значениями)) Сумма вероятностей того, что от 0 пакетов до бесконечных пакетов всегда становится 1,0.

std::poisson_distribution() возвращает количество пакетов за каждый период, среднее значение которых для длительных периодов равно среднему (4,1 в вашем коде), а их распределение является распределением Пуассона.

Вы можете рассчитать это, выполнив следующие шаги.

  1. Составьте таблицу number_of_packet и вероятности.

  2. Создайте случайное число от 0 до 1.

  3. Суммируйте вероятности в таблице, пока сумма не станет больше случайного числа.

  4. (количество вероятностей, используемых для суммирования)-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».

===== Размер пакета - еще одна проблема.

Вы должны определить, какое распределение используется для размера пакета.

Я не думаю, что распределение Пуассона подходит для размера пакета.

person Fumu 7    schedule 30.01.2015

Я боюсь, что способ, которым вы генерируете время прибытия с помощью процесса Пуассона, неверен. Процесс Пуассона не является распределением Пуассона.

Генерация времени прибытия с помощью процесса Пуассона не означает использование распределения Пуассона, как вы это делаете в своем коде. Это делается путем создания экспоненциального распределения на основе лямды скорости поступления Пуассона.

Короче говоря, вам нужно сгенерировать экспоненциальное распределение со средним значением = 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

person Joe    schedule 07.12.2017