Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- SUBROUTINE ran1sub(idum,x)
- !
- IMPLICIT NONE
- !
- !
- !
- INTEGER, PARAMETER :: K4B = selected_int_kind(9)
- !
- INTEGER(K4B), INTENT(INOUT) :: idum !SEMENTE DO NUMERO RANDOMICO, PRECISAO K4B
- !
- REAL(kind=8) :: x !NUMERO RANDOMICO FINAL
- !
- INTEGER(K4B), PARAMETER :: IA=16807, IM=2147483647,IQ=127773,IR=2836 !PARAMETROS DE MANIPULACAO, PRECISAO DADA POR K4B
- !
- REAL(kind=8), SAVE :: am !VARIAVEL DE CONTROLE
- !
- INTEGER(K4B), SAVE :: ix = -1, iy = -1, k !VARIAVEIS DE CONTROLE, PRECISAO DADA POR K4B
- !
- !
- !
- if (idum <= 0 .or. iy < 0) then
- !
- am = nearest(1.0,-1.0)/IM !am RECEBE O PRIMEIRO NUMERO REPRESENTAVEL MENOR QUE 1.0
- !
- iy = ior(ieor(888889999,abs(idum)),1) !GERA O PRIMEIRO PARAMETRO INTEIRO PSEUDO-ALEATORIO, BASEADO NO VALOR DE idum
- !
- ix = ieor(777755555,abs(idum)) !SEGUNDO PARAMETRO INTEIRO PREUDO-ALEATORIO, DEPENDENTE DO VALOR DE idum
- !
- idum = abs(idum)+1 !VALOR DE idum SE TORNA POSITIVO E INCREMENTADO
- !
- end if
- !
- !
- !
- ix = ieor(ix,ishft(ix,13)) !ATUALIZA O PARAMETRO ix, GERANDO UM PARAMETRO COM UM 'NIVEL DE ALEATORIEDADE' MAIOR,
- !BASEADO NO VALOR ANTERIOR ARMAZENADO E UTILIZANDO OPERACOES NOS PROPRIOS BITS
- !
- ix = ieor(ix,ishft(ix,-17)) !REALIZA UMA SEGUNDA ATUALIZACAO NO PARAMETRO ix, BASEADO NO VALOR ACIMA ESTABELECIDO
- !E REALIZANDO MAIS UMA SERIE DE TROCAS DE BITS NO VALOR
- !
- ix = ieor(ix,ishft(ix,5)) !REALIZA UMA ATUALIZACAO FINAL NO NUMERO ix, COM UM RESULTADO FINAL PSEUDO-ALEATORIO
- !COM POUCA REALACAO PROXIMAL COM A SEMENTE INICIAL idum
- !
- k = iy/IQ !GERA UM TERCEIRO PARAMETRO PSEUDO-ALEATORIO, BASEADO NO VALOR DO PARAMETRO iy
- !
- iy = IA*(iy-k*IQ)-IR*k !ATUALIZA O VALOR DE iy, USANDO COMO PARAMETROS O VALOR JA EXISTENTE EM iy E O PARAMETRO
- !k DEFINIDO ACIMA. ESTA OPERACAO DIMINUI A RELACAO COM O VALOR DA SEMENTE idum
- !
- !
- !
- if (iy < 0) iy = iy + IM !TRANSFORMA iy NUM VALOR POSITIVO, CASO SEJA NEGATIVO, EM SOMANDO O MAIOR INTEIRO QUE
- !O SISTEMA CONSEGUE REGISTRAR A ELE, DE MODO QUE TORNA O RESULTADO FINAL UM POUCO
- !MAIS ALEATORIO!
- !
- x = am*ior(iand(IM,ieor(ix,iy)),1) !GERA O NUMERO ALEATORIO REAL AO FINAL, UTILIZANDO OS PARAMETROS am, ix, iy E IM.
- !
- END SUBROUTINE ran1sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement