How do I generate a Poisson Process?

后端 未结 8 1895
被撕碎了的回忆
被撕碎了的回忆 2021-02-20 06:07

Original Question:

I want to generate a Poisson process. If the number of arrivals by time t is N(t) and I have a Poisson distribution with parameter

相关标签:
8条回答
  • 2021-02-20 06:49

    Generating arrival times via Poisson Process does not mean using a Poisson distribution. It is done by creating an exponential distribution based on the Poisson arrival rate lamda.

    In short, you need to generate an exponential distribution with an average = 1/lamda, see the following example:

    #include <iostream>
    #include <iterator>
    #include <random>
    
    int
    main ()
    {
     // seed the RNG
     std::random_device rd; // uniformly-distributed integer random number generator
     std::mt19937 rng (rd ()); // mt19937: Pseudo-random number generation
    
     double averageArrival = 15;
     double lamda = 1 / averageArrival;
     std::exponential_distribution<double> exp (lamda);
    
    double sumArrivalTimes=0;
    double newArrivalTime;
    
    
     for (int i = 0; i < 10; ++i)
      {
       newArrivalTime=  exp.operator() (rng); // generates the next random number in the distribution 
       sumArrivalTimes  = sumArrivalTimes + newArrivalTime;  
       std::cout << "newArrivalTime:  " << newArrivalTime  << "    ,sumArrivalTimes:  " << sumArrivalTimes << std::endl;  
      }
    
    }
    

    The result of running this code:

    newArrivalTime:  21.6419    ,sumArrivalTimes:  21.6419
    newArrivalTime:  1.64205    ,sumArrivalTimes:  23.2839
    newArrivalTime:  8.35292    ,sumArrivalTimes:  31.6368
    newArrivalTime:  1.82962    ,sumArrivalTimes:  33.4665
    newArrivalTime:  34.7628    ,sumArrivalTimes:  68.2292
    newArrivalTime:  26.0752    ,sumArrivalTimes:  94.3045
    newArrivalTime:  63.4728    ,sumArrivalTimes:  157.777
    newArrivalTime:  3.22149    ,sumArrivalTimes:  160.999
    newArrivalTime:  1.64637    ,sumArrivalTimes:  162.645
    newArrivalTime:  13.8235    ,sumArrivalTimes:  176.469
    

    so, based on your experiment you can either use: newArrivalTime or sumArrivalTimes.

    ref: http://www.math.wsu.edu/faculty/genz/416/lect/l05-45.pdf

    0 讨论(0)
  • 2021-02-20 06:57

    If you are using python, you can use random.expovariate(rate) to generate arrival times at rate events per time interval

    0 讨论(0)
  • 2021-02-20 06:58

    In order to pick a sample from a distribution, you need to compute the inverse cumulative distribution function (CDF). You first pick a random number uniformly on the real interval [0, 1], and then take the inverse CDF of that value.

    0 讨论(0)
  • 2021-02-20 07:01

    Here's sample code for generating Poisson samples using C++ TR1.

    If you want a Poisson process, times between arrivals are exponentially distributed, and exponential values can be generated trivially with the inverse CDF method: -k*log(u) where u is a uniform random variable and k is the mean of the exponential.

    0 讨论(0)
  • 2021-02-20 07:02

    If you have a Poisson process with rate parameter L (meaning that, long term, there are L arrivals per second), then the inter-arrival times are exponentially distributed with mean 1/L. So the PDF is f(t) = -L*exp(-Lt), and the CDF is F(t) = Prob(T < t) = 1 - exp(-Lt). So your problem changes to: how to I generate a random number t with distribution F(t) = 1 - \exp(-Lt)?

    Assuming the language you are using has a function (let's call it rand()) to generate random numbers uniformly distributed between 0 and 1, the inverse CDF technique reduces to calculating:

    -log(rand()) / L
    

    As python provides a function to generate exponentially distributed random numbers, you could simulate the first 10 events in a poisson process with an averate rate of 15 arrivals per second like this:

    import random
    for i in range(1,10):
       print random.expovariate(15)
    

    Note that that would generate the *inter*arrival times. If you wanted the arrival times, you would have to keep moving a time variable forward like this:

    import random
    t= 0
    for i in range(1,10):
       t+= random.expovariate(15)
       print t
    
    0 讨论(0)
  • 2021-02-20 07:02

    I would be very careful about using the inverse CDF and pumping a uniform random number through it. The problem here is that often the inverse CDF is numerically unstable or the functions to produce it can give undesirable fluctuations near the ends of the interval. For that reason I would recommend something like the rejection method used in "Numerical Recipes in C". See the poidev function given in ch 7.3 of NRC: http://www.nrbook.com/a/bookcpdf/c7-3.pdf

    0 讨论(0)
提交回复
热议问题