Этот метод основан на следующих 3 шагов алгоритма:Функция Возвращает #value Ошибка иногда
1 - генерировать две равномерные числа на [-1,1] интервал, который вы называете U1 и U2
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
И Called =BoxMuller()
Still #value Ошибка
ли вы когда-нибудь передать отрицательное значение Log (S)? –
Я не думаю, что S будет отрицательным, потому что S - сумма квадратов U1 и U2, поэтому квадрат всегда будет возвращать положительные числа. – newguy
Справа. Попробуйте в то время как вместо этого переходите вместо петли, как вы предполагаете, тогда –