泊松到达分布函数并跟踪它

时间:2011-11-30 20:11:25

标签: c math time traffic poisson

我正在尝试根据泊松到达创建一个随机的“hello world”函数。在下面的代码中,我定义平均值(Lamda)是5.我希望时间从1到5秒过去,并跟踪它。

根据此图像seagullhere中的开源项目here,我可以看到同时但不同的意思,流量随机出现的次数越多(就我而言,“你好世界”)。但就我而言,它只是随机睡眠时间,但Hello World的数量是相同的。

如何根据我上面使用的图像实现这个想法。这是对随机发生器进行泊松分布的正确方法吗?我看到了基于Knuth

的泊松算法

谢谢你的帮助..抱歉我的英语不好。

#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 个答案:

答案 0 :(得分:1)

鉴于您的代码,您将始终打印10次消息。似乎您需要检查在循环开始时是否经过了总时间,如果是,则打破循环。给你一个想法:

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

答案 1 :(得分:1)

我认为INT_MAX出错了,那就是:

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

此外,只要循环以10为界,你就不会得到更多的东西。你期待什么?

以下是该程序的完整C ++ 11(非C!)版本:

通过 https://ideone.com/viZi3 注意>在Time limit exceeded处软件失败,因为IdeOne上有明显的时间限制)< / p>

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

}