program assign3_4
implicit none
integer :: i,n
real,allocatable :: x(:)
real :: sumx,sumx2,m,v
print*,'How many samples?'
read*,n
allocate(x(n))
print*,'Give mean and variance (when var=0, default:mean=0,var=1)?'
read*,m,v
if(v == 0) then
do i=1,n
x(i)=gen_normal(m)
enddo
else
do i=1,n
x(i)=gen_normal(m,v)
enddo
endif
call meansd
contains
function gen_normal(mean,variance) result(c)
real :: c,u(12),mean,var
real,optional :: variance
if(.not.present(variance)) then
mean=0
var=1
else
var=variance
endif
call random_number(u)
c=(sum(u)-6.0)*sqrt(var) + mean
end function
subroutine meansd
sumx=0; sumx2=0
do i=1,n
sumx=sumx+x(i)
sumx2=sumx2+x(i)**2
enddo
sumx=sumx/n
print*,'Mean =',sumx
print*,'Variance =',(sumx2-sumx*sumx*n)/(n-1)
end subroutine
end program assign3_4