1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
module Distribution
implicit none
real, parameter :: PI = 3.14159
contains
subroutine standardNormal( Z ) ! Uses Box-Muller method
real, intent(out) :: Z
real u(2)
call random_number( u ) ! 2 variables uniformly distributed on (0,1)
u(1) = max( u(1), 1.0e-30 ) ! paranoia
Z = sqrt( -2.0 * log( u(1) ) ) * cos( 2.0 * PI * u(2) )
end subroutine standardNormal
real function truncatedNormal( mean, sigma, lower, upper )
real, intent(in) :: mean, sigma, lower, upper
real Z
do
call standardNormal( Z )
truncatedNormal = mean + sigma * Z
if ( truncatedNormal >= lower .and. truncatedNormal <= upper ) return
end do
end function truncatedNormal
end module Distribution
program main
use Distribution ! access module
implicit none
integer :: N = 10
real :: mean = 100, sigma = 10, lower = 95, upper = 115
integer i
call random_seed
write( *, "( f6.2 )" ) ( truncatedNormal( mean, sigma, lower, upper ), i = 1, N )
end program main
|