题
我正在尝试根据泊松到达创建一个随机的“ 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;
...
}
不隶属于 StackOverflow