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