我有一个要求,我需要在发送下一个数据包之前睡一段泊松持续时间。目前我能想到的公式是
( e^(-lambda) X lambda^t ) / fact(t)
然而,对于时间步长 280 和更多,fact(t) 将由于溢出而过时。
有人可以帮助我在 VB .NET 中解决这种传统方式吗?
我认为您正在寻找到达间隔时间。可以使用生成随机到达间隔时间
t = (Math.log(1.0-Math.random())/-lambda
您发布的公式是定义在特定时间段内恰好有 t (在您的情况下)到达的概率的公式。
请参阅有关生成泊松分布的 Wikipedia 文章。
即使阶乘值变得非常大(正如您所观察到的),λ k项也变得有些大以进行补偿。有关表示考虑到这一点的分布的方法,请参阅关于泊松分布的 Wikipedia 文章:
VB 实现可能类似于:
Module Module1
Sub Main()
Console.WriteLine(Poisson(4, 250))
Console.ReadKey()
End Sub
Function Poisson(ByVal lambda As Integer, ByVal k As Integer) As Double
Poisson = Math.Exp(k * Math.Log(lambda) - lambda - SumOverLn(1, k))
End Function
Function SumOverLn(ByVal start As Integer, ByVal endval As Integer) As Long
Dim i As Integer
SumOverLn = 0
For i = start To endval
SumOverLn = SumOverLn + Math.Log(i)
Next
End Function
End Module
过了一会儿,它看起来非常接近 0,以至于它注册为这样。您可能能够调整显示的精度以获得更多小数位,但 0 可能是高值的足够近似值(您从概率论中得到的概念似乎是这些值确实非常接近于零反正)。