在ExcelVBA中高效生成快速正态分布随机数



我一直在寻找一种快速可靠的生成正态分布随机数的方法。

最流行的方法似乎是将Excel工作表函数Norm_Inv与随机数一起使用,但由于需要在Excel和VBA之间来回切换,因此速度相当慢。

我在下面分享我的解决方案,但如果有更好的,我很想知道。

这个解决方案非常快速,并且可以根据需要精确。最初,您将区间0-1划分为大量切片,并调用NORM_INV来获得每个点的正态分布值,将值存储在一个数组中。之后,您就不需要再调用NORM_INV了,只需查找任意随机数的数组值即可。

1000个切片似乎足以给出与直接使用NORM_INV的99%以上的相关性。

Function NormalRandLookup(Optional Mean As Single = 0, Optional StdDev As Single = 1) As Single
Static R() As Single, n As Long 
If n = 0 Then 'set up the lookup table initially
Dim i As Long
n = 1000 'vary this to reduce or increase accuracy 
ReDim R(0 To n)
R(0) = -3.3: R(n) = 3.3 'the extreme values returned by NORM_INV for 0 and 1
For i = 1 To n - 1 
R(i) = Application.WorksheetFunction.Norm_Inv(i / n, 0, 1)
Next i
End If
NormalRandLookup = Mean + StdDev * R(Rnd * n)
End Function

最新更新