123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- module m_random
- contains
- subroutine random(work1,n)
- ! Returns a vector of random values N(variance=1,mean=0)
- implicit none
- integer, intent(in) :: n
- real, intent(out) :: work1(n)
- real, allocatable :: work2(:)
- real, parameter :: pi=3.141592653589
- allocate (work2(n))
- call random_number(work1)
- call random_number(work2)
- work1= sqrt(-2.0*log(work1))*cos(2.0*pi*work2)
- deallocate(work2)
- end subroutine random
- subroutine randn(n, vect)
- implicit none
- integer, intent(in) :: n
- real, intent(out) :: vect(n)
- integer :: i
- real :: a(2), r
- i = 0
- do while (i < n)
- call random_number(a)
- a = 2.0 * a - 1.0
- r = a(1) * a(1) + a(2) * a(2)
- if (r > 1.0) then
- cycle
- end if
- i = i + 1
- ! assume that r is never equal to 0 - PS
- r = sqrt(-2.0 * log(r) / r);
- vect(i) = r * a(1);
- if (i == n) then
- exit
- end if
- i = i + 1
- vect(i) = r * a(2);
- end do
- end subroutine randn
- end module m_random
|