我正在嘗試編寫一個程序,該程序使用lcg作爲一個函數,以使用方塊計算器計算更多的隨機數。我已經獲得了lcg的工作,但使用box muller算法的函數正在給出錯誤的值。這段代碼爲什麼給我不正確的答案?
這裏是我的代碼:
module rng
implicit none
integer, parameter :: dp = selected_real_kind(15,300)
real(kind=dp) :: A=100, B= 104001, M = 714025
contains
function lcg(seed)
integer, optional, intent(in) :: seed
real(kind=dp) :: x = 0, lcg
if(present(seed)) x = seed
x = mod(A * x + B, M)
lcg = x/714025
end function
function muller(seed)
integer, parameter :: dp = selected_real_kind(15,300)
integer, optional, intent(in) :: seed
real(kind = dp) :: y1, y2, mean = 0.49, sd = 0.5, muller1, muller2,
muller, x1, x2, pi = 4.0*ATAN(1.0)
integer :: N = 0
! I had to add the do while loop to ensure that this chunk of code would
only execute once
do while (N<1)
x1 = lcg()
x2 = lcg()
N = N + 1
y1 = sd * SQRT(-2.0*LOG(x1)) * COS(2*pi*(x2)) + mean
y2 = sd * SQRT(-2.0*LOG(x1)) * SIN(2*pi*(x2)) + mean
print *, y1, y2, x1, x2 ! Printing x1 and x2 to allow me to use a
calculator to check program is working correctly
end do
end function
end module
program lcgtest
use rng
implicit none
integer :: N
real(kind=dp) :: lcgmean, ttl = 0, sumof, lcgvar, dev1, muller1, muller2,
lcgerr, lcgdev
real, dimension(10000) :: array
do N = 1, 10000
ttl = ttl + lcg()
dev1 = lcg() - lcgmean
sumof = sumof + dev1
end do
muller1 = muller()
muller2 = muller()
lcgmean = ttl/10000
lcgvar = ((sumof)**2)/10000
lcgdev = SQRT((sumof)**2)/10000
lcgerr = lcgdev/100
print *, lcg(), "mean=", lcgmean, "variance=", lcgvar, lcgerr
end program
的關鍵部分是穆勒功能部分。在檢查我用計算器得到的值之後,我可以看到y1和y2的答案是不同的。
任何幫助,將不勝感激。
請閱讀[問]。它給出了哪個答案?你期望哪個答案?爲什麼? –
'y1'和'y2'是局部變量,你不分配給函數結果。這是一個答案,但我不確定這是一個有用的答案:你似乎缺少對功能如何工作的基本理解。你能提出一個更簡單的問題嗎? – francescalus
好奇,你爲什麼不在模塊級別執行'double(kind = dp),parameter :: pi = 4.0 * ATAN(1.0)',所以每次都不會重新計算? – ja72