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

时间:2015-01-29 23:44:26

标签: c++ random poisson network-traffic

有些事情我不明白。我使用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等等...... 首先,这些数字是什么意思?我的意思是我必须总结它们来创造时机吗?例如: 2,(2 + 3)= 5,(5 + 1)= 6,(6 + 4)= 10,......等等。

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

2 个答案:

答案 0 :(得分:1)

我担心通过泊松过程产生到达时间的方式不正确。泊松过程不是泊松分布。

通过泊松过程生成到达时间并不意味着像在代码中那样使用泊松分布。这是通过基于泊松到达率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

答案 1 :(得分:0)

[有关泊松分布的说明,可以帮助您更好地理解]

“泊松分布”的含义和“std :: poisson_distribution()”的功能紧密相关但不相同。

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

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

您可以按照以下步骤对其进行计算。

  1. 制作number_of_packet和概率表。

  2. 在0到1之间设置一个随机数。

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

  4. (用于概括的概率数量)-2是值。

  5. 示例:如果您将0.3作为随机数。

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

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

    然后'two packets'用于下一个值。

    这是std :: poisson_distribution()中发生的事情。

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

    我假设一段时间是一秒钟,以便于理解。

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

    您可以通过在第二天均匀地放置数据包来实现到达。

    [输出示例:2 3 1]

    时间0s - 1s

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

    时间1s - 2s

    Therre数据包到达。将1秒除以3,并将数据包放在其中间。 =&GT;第一包放置在1.166s,第二包放在1.5s,第三包放在1.833。

    ......等等。

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

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

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

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