通过泊松过程 c++ 生成随机到达
Generating random arrivals via Poisson process c++
有些事情我不明白。我使用 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 44 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),它们的分布是泊松分布。
您可以通过以下步骤进行计算。
制作number_of_packet和概率表。
在 0 到 1 之间创建一个随机数。
对表中的概率求和,直到总和大于随机数。
(用于求和的概率数)-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 44 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"。
=====数据包的大小是另一个问题。
您应该确定数据包大小使用的分布。
我认为泊松分布不适合数据包大小。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- 在类中使用随机生成器时出现性能问题
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 将字符随机转换为大写的函数
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 在C++中随机生成 20 个非重复数字
- GCC:随机构建导致执行期间分段错误
- 如何使用 SML 随机生成八进制元组
- 当我尝试使用它时,Scanf 会抛出一个随机异常(scanf_s 也是如此)
- 将正态随机变量与任意 RHO(corrcoef) 相关联