2017-03-26 106 views
0

我希望此過程在多個單元格中生成相同的數字。我希望錯誤條款保持不變。我是VBA新手,但我假設有一行代碼會告訴它不要使用一組新的隨機值運行公式。基於隨機分佈樣本生成相同數字的VBA函數

Option Base 1 
Function EuropeanOptionMonteCarlo(c_ As String, s As Double, x As Double, t As Double, z As Double, r_ As Double, q As Double, n As Double, nIter As Double) As Variant 
Dim dt, e, dlns, price, SimVar(), PayVar() As Double 
ReDim SimVar(nIter, n + 1) 
ReDim PayVar(nIter) 
dt = t/n 
a = 0 
For i = 1 To nIter 
    SimVar(i + a, 1) = s 
    Randomize 
    p = 0 
    For j = 1 To n 
     If (j - 1)/365 - Int((j - 1)/365) = 0 And j > 1 Then p = p + 1 
     e = WorksheetFunction.NormSInv(Rnd()) 
     dlns = (r_ - q - z^2/2) * dt + z * e * dt^0.5 
     If j - 365 * p = 1 And p > 0 Then 
      SimVar(i + p + a, 2) = SimVar(i + p - 1 + a, 366) * Exp(dlns) 
     Else 
      SimVar(i + p + a, j - 365 * p + 1) = SimVar(i + p + a, j - 365 * p) * Exp(dlns) 
     End If 
    Next j 
    If c_ = "C" Then 
     PayVar(i) = WorksheetFunction.Max(SimVar(i + p + a, j - 365 * p) - x, 0) * Exp(-r_ * t) 
    ElseIf c_ = "P" Then 
     PayVar(i) = WorksheetFunction.Max(x - SimVar(i + p + a, j - 365 * p), 0) * Exp(-r_ * t) 
    End If 
    a = a + p 
Next i 
price = 0 
temp = 0 
For i = 1 To nIter 
    price = price + PayVar(i) 
Next i 
price = price/nIter 
EuropeanOptionMonteCarlo = price 
End Function 

回答

2

VBA文檔在https://msdn.microsoft.com/en-us/library/office/gg264511.aspx

這裏的關鍵是報價如何重複序列


要重複隨機數的序列,具有負 說法立即撥打賽第一輪在使用隨機數與數字參數之前。 使用具有相同數值的隨機數不會重複前面的序列 。

下面是一些代碼

Sub Test() 
    Dim v 
    v = Rnd(-1) 

    Dim lRand As Long 
    lRand = RandomNumber 
    Debug.Assert lRand = 35 '* for me always returns 35 

End Sub 

Function RandomNumber() As Double 
    RandomNumber = Int(1000 * Rnd(1)) 
End Function 
+0

哦!我已被提升! ;-)(會編輯你的答案,以擺脫不正確的狀態ugrade。) – YowE3K