! Metodos Numericos y Simulaciones en Astrofisica
! FCEFN - UNSJ, 2010
!
! ejemplo 2a
!
! numeros aleatorios - metodo mejorado pero usando
! la funcion intrinseca del compilador
!
! distribucion uniforme en [0,1)
!
!
program eje2a
implicit none
  integer :: i,j,k,old
  integer, dimension(10) :: arr
  real :: valr
  
! pongo a cero el array
!
  arr=0
  
! inicializo la subrutina que genera numeros aleatorios
!
  valr=-1.
  
! itero j veces
!
  write(*,*)'Ingrese nro. iteraciones: '
  read(*,*)j
  
  do i=1,j
  
! obtengo un numero aleatorio
!
    call random0(valr)

! lo guardo en un histograma
!
	k=int(valr*10.)+1	
	arr(k)=arr(k)+1
  enddo
  
! encuentro el bin con el mayor valor
!
  old=-12
  k=0
  do i=1,10
    if(arr(i) > old)then
	  old=arr(i)
	  k=i
	endif
  enddo
  
! muestro el resultado
!
  do i=1,10
    write(*,*)i,arr(i),float(arr(i))/float(arr(k))
  enddo
  
end program eje2a

! *******************************************************
! subrutina mejorada para generar numeros
! aleatorios con distribucion uniforme en [0,1)
!
! la subrutina devuelve en val el numero
! aleatorio. Si en la entrada val es negativo
! la subrutina se inicializa
!
subroutine random0(val)
implicit none
  integer :: i
  real :: val,nval
  real, save :: oval
  real, dimension(97), save :: dd

! inicializa
!
  if(val < 0.)then
    call random_seed()
	do i=1,97
	  call random_number(nval)
	enddo
	do i=1,97
	  call random_number(nval)
	  dd(i)=nval
	enddo
	call random_number(oval)
  endif
  
! punto de entrada general
!  
  i=1+int(97.*oval)
  if(i > 97 .or. i < 0)pause
  val=oval
  oval=dd(i)
  call random_number(dd(i))
  return
end subroutine random0
! *******************************************************
