我正在尝试根据泊松到达创建一个随机的“ Hello World”功能。在下面的代码中,我定义了平均平均值(LAMDA)为5。我希望有时间从1-5秒开始过去,并跟踪它。

基于一个OpenSource项目, 海鸥 在此图像中 这里这里, ,我可以在同一时间看到这一点,但是不同的是,流量的随机发生越多(就我而言,“ Hello World”)。但是就我的情况而言,这只是随机睡眠时间,但是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*/
    }

}
有帮助吗?

解决方案

我认为INT_MAX是错误的,请这样做:

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

另外,只要循环在10时界限,您就不会获得更多的hellos。你能指望什么?

这是我的完整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*/
    }

}

其他提示

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

time_t before, timer;
...
time(&before);
for (...) {
    time(&timer);
    if (time - before > timeout) {
         break;
    }
    before = timer;
    ...
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top