通过泊松过程 c++ 生成随机到达

Generating random arrivals via Poisson process c++

本文关键字:随机 c++ 过程      更新时间:2023-10-16

有些事情我不明白。我使用 cpp 引用中给出的示例来生成数字:

const int nrolls = 10; // number of experiments
std::default_random_engine generator;
std::poisson_distribution<int> distribution(4.1);
for (int i=0; i<nrolls; ++i){
int number = distribution(generator);
cout<<number<<" "<<endl;
}

(原始代码:http://www.cplusplus.com/reference/random/poisson_distribution/)

此输出:2 3 1 4 3 4

4 3 2 3 3 等等...首先,这些数字意味着什么?我的意思是我必须将它们相加以创建时间吗?例如:2,(2+3)=5,(5+1)=6,(6+4)=10,...,等等。

其次,我真正的问题是,我需要生成网络数据包的随机到达和数据包的大小。我的意思是,当数据包来了,如果数据包来了,数据包的大小是多少?我该怎么做?我需要这样的东西:http://i.hizliresim.com/dWmaGX.png

怕您通过泊松过程生成到达时间的方式不正确。泊松过程不是泊松分布。

通过泊松过程生成到达时间并不意味着像在代码中那样使用 Poisson 分布。这是通过创建基于泊松到达率 lamda 的指数分布来完成的。

简而言之,您需要生成平均值 = 1/lamda 的指数分布,请参阅以下示例:

#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;  
  }
}

运行此代码的结果:

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

因此,根据您的实验,您可以使用:newArrivalTime或sumArrivalTimes。

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

[关于泊松分布的解释,可能有助于您更好地理解]

"

泊松分布"的含义和"std::p oisson_distribution()"的功能密切相关,但不相同。

泊松分布是离散概率分布。您可以计算概率,例如下一个时间段(例如一秒)没有数据包的概率为 0.002,一个数据包的概率为 0.075,两个数据包的概率为 0.15,三个数据包的概率为 0.20,依此类推,当平均到达为 4 时。(我使用的可能性值是样本(不是实际值))对于 0 个数据包到无限个数据包,总概率始终变为 1.0。

std::p oisson_distribution() 返回每个周期的数据包数,其中长周期的数据包数等于平均值(代码中为 4.1),它们的分布是泊松分布。

您可以通过以下步骤进行计算。

  1. 制作number_of_packet和概率表。

  2. 在 0 到 1 之间创建一个随机数。

  3. 对表中的概率求和,直到总和大于随机数。

  4. (用于求和的概率数)-2 是值。

示例:如果您获得 0.3 作为随机数。

无数据包到两个数据包的概率之和为 0.002+0.075+0.15= 0.227 小于 0.3。

无数据包到三个数据包的概率之和为 0.002+0.075+0.15+0.20= 0.427 大于 0.3。

然后"两个数据包"用于下一个值。

这是在std::p oisson_distribution()中发生的事情的例证。

[直接回答您的问题:如何在泊松分布中使数据包到达]

我假设一个周期是一秒,以便于理解。

输出:2 3 1 4 3 4

4 3 2 3 你得到的是每秒的数据包数,第一秒两个数据包,第二秒三个数据包,第三秒一个数据包,依此类推。

您可以通过在该秒内均匀放置数据包来到达。

[输出示例:2 3 1]

时间 0s - 1s

两个数据包到达。将 1 秒除以 2(两个 0.5s 周期),并将数据包放在中间。=> 第一个数据包放置在 0.25 秒,第二个数据包放置在 0.75 秒。

时间 1s - 2s

特雷数据包到达。将 1 秒除以 3,然后将数据包放在中间。=> 第一个数据包位于 1.166s,第二个数据包位于 1.5s,第三个数据包位于 1.833。

。等等。

0.25、0.75、1.166、1.5、1.833 是前五个数据包的到达时间,来自您得到的"输出:2 3"。

===

==数据包的大小是另一个问题。

您应该确定数据包大小使用的分布。

我认为泊松分布不适合数据包大小。