我正在尝试根据泊松到达创建一个随机的“hello world”函数。在下面的代码中,我定义平均值(Lamda)是5.我希望时间从1到5秒过去,并跟踪它。
根据此图像seagull和here中的开源项目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*/
}
}
答案 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*/
}
}