Функция распределения Пуассона прибытия и отслеживать его - PullRequest
3 голосов
/ 01 декабря 2011

Я пытаюсь создать случайную функцию "привет мир", основанную на прибытии Пуассона. В приведенном ниже коде я определяю, что среднее значение (Lamda) равно 5. И я хочу, чтобы время истекло от 1 до 5 секунд и отслеживало его.

Основываясь на проекте с открытым исходным кодом, чайка на этом изображении здесь и здесь , я вижу, что в то же время, но другое значение означает, что чем больше это случайные случаи трафика (в моем случае, «привет мир»). Но для моего случая это просто случайное время сна, но число Hello World одинаково.

Как мне реализовать идею, основываясь на изображениях, подобных тому, что я использую выше. Это правильный способ распределения Пуассона для генератора случайных чисел? Я видел алгоритм Пуассона, основанный на Кнут

Спасибо за помощь. Извините за мой плохой английский.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#include <string.h>
#include <time.h>

int poisson(double lambda){
  int k=0;
  double L=exp(-lambda), p=1;
  do {
    ++k;
    p *= rand()/(double)INT_MAX;
  } while (p > L);
  return --k;
}

int main()
{
int i=0; 
int val=0;
time_t timer;
char buffer[25];
struct tm* val_time;



    /*For time= 0 until time=10*/
    for  (i=0; i<10; i++)
    {
    printf("Hello World\n");

    /*To print the time*/
    time(&timer);
    val_time = localtime(&timer);
    strftime(buffer, 25, "%Y:%m:%d%H:%M:%S", val_time);
    puts(buffer);

    sleep(poisson(2)); /*interarrival process*/
    }

}

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Я думаю, что INT_MAX ошибочен, сделайте так:

    p *= rand()/(double)RAND_MAX;

Кроме того, пока цикл ограничен на 10, вы не получите больше приветов.Что вы ожидаете?

Вот моя полная версия программы на C ++ 11 (не C!):

Смотрите ее в прямом эфире на https://ideone.com/viZi3 ( Примечание Это происходит из-за ошибки Time limit exceeded из-за очевидных временных ограничений на IdeOne)

#include <iostream>
#include <random>
#include <chrono>
#include <iomanip>

static std::mt19937 rng;
static std::poisson_distribution<int> poisson(2.0);

typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::time_point<Clock> Time;

int main()
{
    const Time finish_pole = Clock::now() + std::chrono::seconds(10);

    for (Time now = Clock::now(); now <= finish_pole; now = Clock::now())
    {
        std::cout << "Hello World\n";

        std::time_t now_c = Clock::to_time_t(now);
#if CXX11_SUPPORT_COMPLETE
        std::cout << std::put_time(std::localtime(&now_c), "%F %T") << std::endl;
#else
        char buffer[25];
        strftime(buffer, 25, "%Y:%m:%d%H:%M:%S", localtime(&now_c));
        std::cout << buffer << std::endl;
#endif

        sleep(poisson(rng)); /*interarrival process*/
    }

}
1 голос
/ 01 декабря 2011

Учитывая ваш код, вы всегда будете печатать сообщение 10 раз. Кажется, вам нужно проверить, истекло ли ваше общее время в начале цикла, и, если это так, прервать цикл. Чтобы дать вам представление:

time_t before, timer;
...
time(&before);
for (...) {
    time(&timer);
    if (time - before > timeout) {
         break;
    }
    before = timer;
    ...
}
...