2

我有一个要求,我需要在发送下一个数据包之前睡一段泊松持续时间。目前我能想到的公式是

( e^(-lambda) X lambda^t ) / fact(t)

然而,对于时间步长 280 和更多,fact(t) 将由于溢出而过时。

有人可以帮助我在 VB .NET 中解决这种传统方式吗?

4

2 回答 2

2

我认为您正在寻找到达间隔时间。可以使用生成随机到达间隔时间

t = (Math.log(1.0-Math.random())/-lambda

您发布的公式是定义在特定时间段内恰好有 t (在您的情况下)到达的概率的公式。

请参阅有关生成泊松分布的 Wikipedia 文章。

于 2011-08-22T00:49:48.307 回答
0

即使阶乘值变得非常大(正如您所观察到的),λ 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 可能是高值的足够近似值(您从概率论中得到的概念似乎是这些值确实非常接近于零反正)。

于 2011-08-22T00:25:15.170 回答