Excel VBA:实现Box Muller,Zigurrat和均匀率算法

时间:2019-01-09 10:33:31

标签: excel vba algorithm runtime stochastic

这是一个非常具体的问题,将随机知识和VBA技能融合在一起。太令人兴奋了!

在给定均匀分布的随机数源的情况下,我正在尝试比较几种用于生成标准,正态分布数的方法。因此,我正在实现Box Muller AlgorithmZiggurat AlgorithmRatio of Uniforms Algorithm。在生成干净的标准正态分布方面,每个实现都非常有效。 (由Shapiro-Wilk-Test选中)。

我要查找的内容:最快的方法

使用每个生成的总数为10 ^ 7的数字测试每个程序,这些是运行时间:

Box-Muller:3.7秒
Ziggurat:1.28秒
校服比例:10,77秒

实际上,我对那些阅读很高兴,因为我没想到它会这么快。当然,每种方法的运行时间也取决于我的编程技能和VBA知识。

我的问题:经过一些研究,我发现均匀率算法应该最快(比Box Muller快3至4倍)。此信息仅取决于此stack

enter image description here

我很好奇如果这只是该用户的错误声明,或者(我期望更多)如果我的代码实现不完善。因此,我将发布我的代码,并希望有人能帮助我解决我的问题,如果我的代码还不够好,或者如果“均匀率”不能如上述那样快地工作。

Sub RatioUniforms()

Dim x(10000000) As Double
Dim passing As Long
Dim amount As Long: amount = 10000000
Dim u1 As Double
Dim u2 As Double
Dim v2 As Double

    Do While passing <= amount
        Do
            u1 = Rnd    'rnd= random number(0,1)
        Loop Until u1 <> 0  'u1 musn't become 0
        v2 = Rnd
        u2 = (2 * v2 - 1) * (2 * exp(-1)) ^ (1 / 2)
        If u1 ^ 2 <= exp(-1 / 2 * u2 ^ 2 / u1 ^ 2) Then
            x(passing) = u2 / u1
            passing = passing + 1
        End If
    Loop

 End Sub

非常感谢您为我提供帮助。也许你们中的一些人已经用VBA或其他语言尝试过这些算法,并且可以帮助我获得有关运行时间的经验?如果您需要其他有关我的其他实现的信息,请告诉我。祝你有美好的一天!

0 个答案:

没有答案