我正在开发一个网络模拟器,其中数据包到达和传输尝试的事件遵循泊松分布。我改编了Knuth的算法:
public class Poisson {
private double λ;
private Random rand;
/** Creates a variable with a given mean. */
public Poisson(double λ) {
this.λ = λ;
rand = new Random();
}
public int next() {
double L = Math.exp(-λ);
double p = 1.0;
int k = 0;
do {
k++;
p *= rand.nextDouble();
} while (p > L);
return k - 1;
}
}
我的规范声明节点使用泊松过程随机重新安排楼层。平均到达时间是指数分布的,平均值为Ts = 2.5ms。我使用λ= 2.5是否正确?
当我想要新来的活动时,我会做类似的事情:
Event evt = new Event(EventType.ARRIVAL_EVENT,
MasterClock.getTime + poisson.next());
eventList.add(evt);
模拟器应该运行几次,每次都会增加负载来测量性能。起初我认为到达率等于λ但是λ越大我得到的每秒数据包越少。到达率和λ之间的关系是什么? 对于很长的帖子我感到很遗憾,但是如果没有有效的网络模拟资源,我会在很多大学图书和互联网上搜索我感到非常沮丧......
提前感谢您的帮助。
答案 0 :(得分:3)
这可能看起来很奇怪,但对于泊松过程,您不需要泊松分布而是指数分布。查看wikipedia。
您在代码中模拟的到达间隔时间遵循exponential distribution参数lambda = 1 / 2.5(lambda是均值的倒数)。您可以使用-Math.log(1.0 - rand.nextDouble())/ lambda轻松获得随机指数变量。
泊松过程有两种视图:上述视图保持事件数固定(1)并且时间间隔变化。另一个视图保持时间间隔固定,但该间隔中的事件数是随机变量(并遵循泊松分布)。
答案 1 :(得分:0)
Ts = 2.5ms。我是否正确使用λ= 2.5
没有。 Ts是时间。λ是每秒项目中的到达率。见William Stallings, Queueing Analysis.