是基于以下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
右对。尝试一下,而不是像你建议的循环,然后 –