! Metodos Numericos y Simulaciones en Astrofisica
! FCEFN - UNSJ, 2010
!
! ejemplo 2d
!
! numeros aleatorios - genera una distribucion arbitraria
!
!
!
program eje2d
implicit none
  integer :: i,j,k
  real :: valr
  
! inicializo la subrutina que genera numeros aleatorios
!
  write(*,*)'Ingrese semilla (int): '
  read(*,*)j
  valr=-float(j)
  
  k=0
  open(7,file='eje2d.out')
  do i=1,30
  
! obtengo un numero aleatorio
!
    call random1(valr)
	j=int(valr*50.*abs(sin(i*3.141592/30)))
	k=k+j
	write(7,*)i,j,k
  enddo
  
  close(7)
end program eje2d


! *******************************************************
! subrutina mejorada para generar numeros
! aleatorios con distribucion uniforme en [0,1)
! y portable (no usa random_number) con un generador
! lineal multiplicativo congruente.
!
! la subrutina devuelve en val el numero
! aleatorio. Si en la entrada val es negativo
! la subrutina se inicializa
!
subroutine random1(val)
implicit none
  integer, parameter :: ma=2147483647, aa=16807, qq=127773, rr=2836
  real, parameter :: fac=1./ma
  integer :: i,hi,lo
  integer, save :: idum
  integer, dimension(97), save :: dd
  real :: val
  
! inicializa
!
  if(val < 0.)then
    idum=-int(val)
	do i=1,97
	  hi=idum/qq
	  lo=mod(idum,qq)
	  idum=aa*lo-rr*hi
	  if(idum < 0)idum=idum+ma
	  dd(i)=idum
	enddo
  endif
  
! punto de entrada general
!
  i=1+(97*idum)/ma
  if(i > 97 .or. i< 0)pause
  idum=dd(i)
  val=float(idum)*fac
  hi=idum/qq
  lo=mod(idum,qq)
  idum=aa*lo-rr*hi
  if(idum < 0)idum=idum+ma
  dd(i)=idum
  return
end subroutine random1
! *******************************************************