【发布时间】:2016-06-10 12:08:54
【问题描述】:
此方法基于以下 3 步算法:
1 - 在 [-1,1] 区间上生成两个统一的数字,您将称之为 U1 和 U2
2 - 计算 S = U1 ^2 + U2^2
3 - 如果 S
用 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 错误
【问题讨论】:
-
您是否曾经将负值传递给 Log(S)?
-
我认为 S 不会是负数,因为 S 是 U1 和 U2 的平方和,所以平方总是返回正数
-
对对对。尝试一段时间而不是像你建议的那样循环
-
hmm 也许.... 如果 S 0 那么 ....
-
我的意思是......你也不能通过 log(0) 如果 Rand 给你 .0001 * .0001 你开始得到比 double 可以容纳的更大的数字大小?我会编写一个调试 if 语句来查看 s 是否小于 .0001
标签: vba function excel excel-formula