在VBA中重复rnd()数字

时间:2015-02-13 19:19:54

标签: vba excel-vba random simulation normal-distribution

我正在VBA中编写MonteCarlo模拟。这是代码:

 Sub Simular()

 Dim i As Integer
 Dim j As Integer
 Dim simulacion As Integer
 Dim iterar As Single
 Dim mu As Double
 Dim varianza As Double
 Dim aleat As Double
 Dim cantidad As Double
 Dim fecha As Date
 simulacion = Sheet8.Cells(2, 3)

 mu = Sheet8.Cells(7, 3)
 varianza = Sheet8.Cells(8, 3)
 cantidad = Sheet8.Cells(10, 3)
 fecha = WorksheetFunction.WorkDay(Sheet8.Cells(4, 2), cantidad)
 Sheet8.Cells(15, 4) = fecha
 Sheet8.Cells(1, 2) = cantidad
 Sheet8.Cells(3, 3) = Sheet8.Cells(1, 3)

 For j = 1 To 10000 'number of simulation
 iterar = Sheet8.Cells(15, 3)
 For i = 1 To 231 'workdays
 aleat = Rnd()
 iterar = iterar * Exp((mu - 1 / 2 * varianza) +      WorksheetFunction.Power(varianza, 0.5) * WorksheetFunction.Power(1, 0.5) *     WorksheetFunction.Norm_Inv(aleat, 0, 1))
 'Sheet8.Cells(10030 + j, 12 + i) = aleat
 'Sheet8.Cells(17 + j, 12 + i) = iterar
 Next i
 Sheet8.Cells(17 + j, 4) = iterar
 Next j
 End Sub

问题在于总是重复3种不同的模拟。例如,当我输入mu = 1/252(利率)时,第一次模拟的第一个数字是5,570,当我再次运行模拟时,那些模拟的第一个数字是9,610,第三个数字是72,23。第四次是5,570,所以它重复。我不知道为什么,因为rnd()数字,所有都必须不同。

此外,在第三个模拟中,出现一条消息,指出无法获得工作表类的“normsinv属性”

我尝试了很多东西,但我没有发现错误!

感谢您的帮助! :)

1 个答案:

答案 0 :(得分:0)

你试过了吗?

Application.Worksheetfunction.NormInv(aleat,0,1)

或者,如果您一直在寻找平均值为0且std dev为1的逆正态分布,您可以使用:

Application.Worksheetfunction.NormsInv(aleat)

至于你的rnd()问题,你是否尝试过直接在你的normsinv函数中使用rnd()?或者,在设置aleat = rnd()之前的行中,尝试:

Randomize

这将重置函数rnd()的种子数。