是基於以下3個步驟的算法此方法#VALUE錯誤:函數返回有時
1 - 生成關於[-1,1]的間隔,你將調用U1和U2
2個統一編號2 - 計算S = U1^2 + U2^2
3 - 若S < 1正常數由U1給出*平方根(-2 LN(S)/ S),否則返回到步驟1直到S < 1.
在VB中編寫這個函數並給它命名BoxMuller。
這是我寫的基於上述步驟的功能我不知道它是否是正確與否,因爲有時它會返回#VALUE錯誤
我通過以下數值函數=BoxMuller(Rand(),Rand())
Function BoxMuller(U1 As Double, U2 As Double) As Double
Dim S As Double
Do
U1 = WorksheetFunction.NormInv(U1, 0, 1)
U2 = WorksheetFunction.NormInv(U2, 0, 1)
S = U1 * U1 + U2 * U2
If S < 1 Then
BoxMuller = U1 * Sqr(-2 * Log(S)/S)
Exit Function
End If
Loop Until S < 1
End Function
是Loop Until S < 1
條件正確,因爲我認爲這可能是錯誤的真正原因。
另外試過如下:
Function BoxMuller() As Double
Dim S As Double
Dim U1 As Double
Dim U2 As Double
Do
U1 = WorksheetFunction.RandBetween(-1, 1)
U2 = WorksheetFunction.RandBetween(-1, 1)
S = U1 * U1 + U2 * U2
If S < 1 Then
BoxMuller = U1 * Sqr(-2 * Log(S)/S)
Exit Function
End If
Loop
End Function
和被叫=BoxMuller()
儘管如此#VALUE錯誤
你曾經傳遞一個負值到日誌(S )? –
我不認爲S會是負面的,因爲S是U1和U2平方的總和,所以方塊總會返回正數 – newguy
右對。嘗試一下,而不是像你建議的循環,然後 –