program randomNumbers

!/////////////////////////////////////////////////////////////////////
!/ Para generar numeros aleatoris una computadora utiliza formulas   /
!/ La salida de estas formulas estan muy dispersa en el reango [0,1] /
!/ Estas formulas comienzan con un valor inicial llamado "semilla"   /
!/ (Fortran en realidad usa varias semillas que se cargan en una     /
!/ array, el tamano de este array depende del sistema, en mi PC es8) /
!/ Si la (las) semilla de entrada es siempre la misma el genrador de /
!/ numeros aleatorios arroja siempre el mismo resultado en c/corrida /
!/ La subrutina initRnadomSeed utilia e reloj de sistema para que las/
!/ semilla de entrada al generador (random_number(number)) varie en  /
!/ cada corrida.                                                     /
!/////////////////////////////////////////////////////////////////////


real :: randomNumber

! Esta subrutina me inicializa las semillas de forma que siempres sean distintas 
call initRandomSeed()

! Probar de correr el programa varias veces y ver que los diez numeros son siempre distintos
do i= 1,10
   call random_number(randomNumber)
   print*, randomNumber
end do


contains

subroutine initRandomSeed()

   integer :: i, n, clock
   integer, dimension(:), allocatable :: seed
   
   call random_seed(size = n)
   allocate(seed(n))
   call system_clock(count=clock)
   seed = clock + 37 * (/ (i - 1, i = 1, n) /)
   call random_seed(put = seed)
   deallocate(seed)
   
end subroutine initRandomSeed

end program randomNumbers