泊松到达分布函数及其跟踪

3
我正在尝试基于泊松到达创建一个随机的“hello world”函数。在下面的代码中,我定义平均值(Lamda)为5。我希望时间从1-5秒流逝,并跟踪它。
基于开源项目seagull,在这个图片herehere中,我可以看到对于相同的时间,但不同的平均值,交通流量(在我的情况下,“hello world”)更随机出现。但是对于我的情况,它只是得到随机的睡眠时间,但“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个回答

1
根据您的代码,您将始终打印10次消息。看起来您需要检查循环开始时经过的总时间,并在需要时中断循环。这是一个示例:
time_t before, timer;
...
time(&before);
for (...) {
    time(&timer);
    if (time - before > timeout) {
         break;
    }
    before = timer;
    ...
}

抱歉,我不明白你的意思。你说的“似乎需要检查循环开始时经过的总时间,如果是,则中断循环。”是什么意思? - xambo
@xambo,我稍微扩展了一下答案。希望能有所帮助。 - Victor Sorokin

1

我认为INT_MAX有误,改成:

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

另外,只要循环在10次以内,你就不会得到更多的“hello”。你期望什么?

这是我完整的C++11(不是C!)版本的程序:

https://ideone.com/viZi3上实时查看(注意,由于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*/
    }

}

我的意思是,如果你看到参考链接链接的同时,根据Lamda变量,Lamda越大,我获得的就越多,而Lamda越小,我获得的就越少.. 是的,我认为我不应该把循环限制在十次,怎么解决? - xambo
抱歉,我的理解有些愚钝。但是我看了你的代码,基本上做的事情是一样的...(除了无限循环)? - xambo
@xambo:你只看代码,不看注释吗?无论如何,我现在发布一个完成的版本。 - sehe
@sehe:我花了一些时间才理解它... :)) 谢谢! - xambo
@xambo:欢迎 :) 我学到了很多东西(包括chronopoisson_distribution,这些都是我之前不熟悉的)。 - sehe
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接