在VBA中生成具有正态分布的随机数-运行时错误“ 1004”

时间:2019-01-26 20:01:31

标签: excel vba random

在VBA中生成具有正态分布的随机数时遇到问题。 我正在研究NSGAII。我使用“ Application.WorksheetFunction.Norm_Inv(Rnd,均值,偏差)”生成具有正态分布的随机数。 但是我这个错误引发了:

运行时错误“ 1004”: 无法获取worksheetfunction类的Norm_Inv属性

如何解决此错误?

我已经在另一个简单的宏中使用了此代码,并且可以正常工作。但是在NSGAII代码中使用此代码会出现错误! (在NSGAII代码中定义并使用了大量变量(双精度,长整型,布尔型等)和2D数组,并由一些do while,for等循环组成)

我在“ Function GenerateNormRand()As Double”行使用了断点。当我中断并继续(逐步运行代码)时,没有任何错误!但是,如果我不这样做,就会出现错误。

Option Explicit
Function Mutation () As Variant
    .
    .
    .
    Dim RandomNumber As Double
    RandomNumber = GenerateNormRand ()
    .
    .
    .
End Function

Function GenerateNormRand () as double
    Dim myrand As Double
    randomize
    myrand = Application.WorksheetFunction.Norm_Inv(Rnd, 0, 5)
    GenerateNormRand = myrand
End Function

即使在每个输入和输出变量上都明确声明Double的情况,GenerateNormRand = Application.WorksheetFunction.Norm_Inv ...行也会引发运行时错误1004:

Sub TestThisFunction()
    MsgBox GenerateNormRand
End Sub

Function GenerateNormRand() As Double
    Randomize
    GenerateNormRand = Application.WorksheetFunction.Norm_Inv( _
        CDbl(Rnd), CDbl(0), CDbl(5))
End Function

1 个答案:

答案 0 :(得分:1)

您的问题描述似乎很神秘,但是如果您要绕过工作表功能,则可以使用Box-Muller transform在纯VBA中生成自己的普通随机变量:

Function RandNorm(Optional mean As Double = 0, Optional sd As Double = 1) As Double
    Dim r1 As Double, r2 As Double, s As Double
    r1 = Rnd()
    If r1 = 0 Then r1 = Rnd() 'no danger of two zeros in a row in rnd()
    r2 = Rnd()
    s = Sqr(-2 * Log(r1)) * Cos(6.283185307 * r2) '6.28 etc. is 2*pi
    RandNorm = mean + sd * s
End Function
相关问题