module globals implicit none save integer, parameter:: dble = kind(1d0) end module globals module NormalDeviates use globals contains subroutine gasdev(harvest) use globals implicit none real(dble), intent(out) :: harvest real(dble) :: rsq,v1,v2 real(dble), save :: g logical, save :: gaus_stored=.false. if (gaus_stored) then harvest=g gaus_stored=.false. else do call random_number(v1) call random_number(v2) v1=2.0*v1-1.0 v2=2.0*v2-1.0 rsq=v1**2+v2**2 if (rsq > 0.0 .and. rsq < 1.0) exit end do rsq=sqrt(-2.0*log(rsq)/rsq) harvest=v1*rsq g=v2*rsq gaus_stored=.true. end if end subroutine gasdev end module NormalDeviates program example use NormalDeviates implicit none real(dble) x(300) integer i open(12,file = "data_out.txt") do i=1,300 call gasdev(x(i)) write(12,*) x(i) end do close(12) end program example