【发布时间】:2011-08-21 20:23:01
【问题描述】:
我有一个要求,我需要在发送下一个数据包之前睡一个泊松持续时间。目前我能想到的公式是
( e^(-lambda) X lambda^t ) / fact(t)
但是,对于时间步长 280 和更多,fact(t) 将由于溢出而过时。
有人可以帮我在 VB .NET 中解决这种传统方式吗?
【问题讨论】:
我有一个要求,我需要在发送下一个数据包之前睡一个泊松持续时间。目前我能想到的公式是
( e^(-lambda) X lambda^t ) / fact(t)
但是,对于时间步长 280 和更多,fact(t) 将由于溢出而过时。
有人可以帮我在 VB .NET 中解决这种传统方式吗?
【问题讨论】:
我认为您正在寻找到达间隔时间。可以使用生成随机到达间隔时间
t = (Math.log(1.0-Math.random())/-lambda
您发布的公式定义了在特定时间段内恰好有 t(在您的情况下)到达的概率。
请参阅generating Poisson distributions 上的维基百科文章。
【讨论】:
即使阶乘值变得非常大(正如您所观察到的),λ k 项也变得有些大以进行补偿。有关表示考虑到这一点的分布的方法,请参阅the Wikipedia article on the Poisson distribution:
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 可能是高值的足够近似值(您从概率论中得到的概念似乎是这些值确实非常接近于零无论如何)。
【讨论】: