【问题标题】:Poisson arrival distribution function and keep track it泊松到达分布函数并跟踪它
【发布时间】:2011-11-30 20:11:24
【问题描述】:

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

基于一个开源项目,seagull 在这张图片中的herehere,我可以看到在同一时间,但不同的意思,流量的随机发生越多(在我的例子中, “你好世界”)。但就我而言,它只是随机睡眠时间,但 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*/
    }

}

【问题讨论】:

    标签: c math time traffic poisson


    【解决方案1】:

    我认为 INT_MAX 有错误,请这样:

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

    此外,只要循环以 10 为界,您就不会收到更多的问候。你期待什么?

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

    【讨论】:

    • 我的意思是,如果你同时看到引用linklink,基于Lamda变量,Lamda越大,我得到的越多,Lamda越少,越少我得到了打印.. 是的,我认为我不应该将循环绑定到十,如何解决这个问题?
    • 嗯,对不起我的愚蠢。但我读了你的代码,它基本上是在做同样的事情..(无限循环除外)?
    • @xambo:您只阅读了代码,而不是 cmets?无论如何,现在发布一个完整的版本
    • 完整的 C++11 版本现已完成,请参阅更新后的答案 PS。它在 IDEONE 上直播:ideone.com/viZi3
    • 我忍不住你+1!
    【解决方案2】:

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

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

    【讨论】:

    • 抱歉,我没听懂。 “似乎您需要检查您的总时间是否在循环开始时经过,如果是,则中断循环”是什么意思。 ?
    • @xambo 我已经扩展了答案。希望,它会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2016-11-10
    • 2018-06-13
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多