Advertisement
Guest User

GeradorAleatorio

a guest
Nov 22nd, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. SUBROUTINE ran1sub(idum,x)
  2. !
  3. IMPLICIT NONE
  4. !
  5. !
  6. !
  7.    INTEGER, PARAMETER          :: K4B = selected_int_kind(9)                    
  8. !
  9.    INTEGER(K4B), INTENT(INOUT) :: idum                                          !SEMENTE DO NUMERO RANDOMICO, PRECISAO K4B
  10. !
  11.    REAL(kind=8)                :: x                                             !NUMERO RANDOMICO FINAL
  12. !
  13.    INTEGER(K4B), PARAMETER     :: IA=16807, IM=2147483647,IQ=127773,IR=2836     !PARAMETROS DE MANIPULACAO, PRECISAO DADA POR K4B
  14. !
  15.    REAL(kind=8), SAVE          :: am                                            !VARIAVEL DE CONTROLE
  16. !
  17.    INTEGER(K4B), SAVE          :: ix = -1, iy = -1, k                           !VARIAVEIS DE CONTROLE, PRECISAO DADA POR K4B  
  18. !
  19. !
  20. !      
  21.         if (idum <= 0 .or. iy < 0) then
  22. !
  23.                 am = nearest(1.0,-1.0)/IM                       !am RECEBE O PRIMEIRO NUMERO REPRESENTAVEL MENOR QUE 1.0
  24. !
  25.                 iy = ior(ieor(888889999,abs(idum)),1)           !GERA O PRIMEIRO PARAMETRO INTEIRO PSEUDO-ALEATORIO, BASEADO NO VALOR DE idum
  26. !
  27.                 ix = ieor(777755555,abs(idum))                  !SEGUNDO PARAMETRO INTEIRO PREUDO-ALEATORIO, DEPENDENTE DO VALOR DE idum
  28. !
  29.                 idum = abs(idum)+1                              !VALOR DE idum SE TORNA POSITIVO E INCREMENTADO
  30. !      
  31.         end if
  32. !
  33. !
  34. !
  35.         ix = ieor(ix,ishft(ix,13))              !ATUALIZA O PARAMETRO ix, GERANDO UM PARAMETRO COM UM 'NIVEL DE ALEATORIEDADE' MAIOR,
  36.                                                 !BASEADO NO VALOR ANTERIOR ARMAZENADO E UTILIZANDO OPERACOES NOS PROPRIOS BITS
  37. !
  38.         ix = ieor(ix,ishft(ix,-17))             !REALIZA UMA SEGUNDA ATUALIZACAO NO PARAMETRO ix, BASEADO NO VALOR ACIMA ESTABELECIDO
  39.                                                 !E REALIZANDO MAIS UMA SERIE DE TROCAS DE BITS NO VALOR
  40. !
  41.         ix = ieor(ix,ishft(ix,5))               !REALIZA UMA ATUALIZACAO FINAL NO NUMERO ix, COM UM RESULTADO FINAL PSEUDO-ALEATORIO
  42.                                                 !COM POUCA REALACAO PROXIMAL COM A SEMENTE INICIAL idum
  43. !
  44.         k = iy/IQ                               !GERA UM TERCEIRO PARAMETRO PSEUDO-ALEATORIO, BASEADO NO VALOR DO PARAMETRO iy
  45. !
  46.         iy = IA*(iy-k*IQ)-IR*k                  !ATUALIZA O VALOR DE iy, USANDO COMO PARAMETROS O VALOR JA EXISTENTE EM iy E O PARAMETRO
  47.                                                 !k DEFINIDO ACIMA. ESTA OPERACAO DIMINUI A RELACAO COM O VALOR DA SEMENTE idum
  48. !
  49. !
  50. !
  51.         if (iy < 0) iy = iy + IM                !TRANSFORMA iy NUM VALOR POSITIVO, CASO SEJA NEGATIVO, EM SOMANDO O MAIOR INTEIRO QUE
  52.                                                 !O SISTEMA CONSEGUE REGISTRAR A ELE, DE MODO QUE TORNA O RESULTADO FINAL UM POUCO
  53.                                                 !MAIS ALEATORIO!
  54. !
  55.         x = am*ior(iand(IM,ieor(ix,iy)),1)      !GERA O NUMERO ALEATORIO REAL AO FINAL, UTILIZANDO OS PARAMETROS am, ix, iy E IM.
  56. !
  57. END SUBROUTINE ran1sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement