在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
答案 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