Observação Antes de iniciar esta seção, deve ser vista a seção do compartilhamento de variáveis Module.
Em vários problemas computacionais é imprescindível a utilização de um gerador de números aleatórios. O propósito em geral é construir uma amostragem que possua algum tipo de ruido. Em outros casos como a técnica de Monte Carlo é muito importante que se utilize um bom gerador de números aleatórios.
Este tema é muito rico em discussões e temos livros específicos sobre geradores de números aleatórios, inclusive especificações e classes de geradores de números aleatórios. De fato o nosso propósito aqui não é estudar a construção de geradores de números aleatórios e sim a utilização deles, no entanto temos que nos atentar ao detalhe de sempre testarmos a qualidade dos geradores de números aleatórios. Um teste simples é verificar a média para uma amostragem dos números aleatórios gerados, em geral geradores de números aleatórios nos devolvem números a média de vários números gerados deve ser próximo de . Outro teste bastante simples de se fazer é construir um histograma do números gerados, quando o número de sorteios tender para o infinito o histograma tem que mostrar um resultado constante.
Na linguagem específica o gerador de números aleatórios que iremos estudar é na verdade um pseudo gerador de números aleatórios pois utilizamos algoritmos, um modelo, para gerar esses números, mas como dito anteriormente sobre essa discussão é melhor conversar com algum especialista sobre o assunto.
Este algoritmo3.9 que veremos a seguir utiliza uma semente, um número inteiro positivo, para disparar o gerador de números aleatórios. Vale frisar que para uma semente sempre teremos a mesma sequência de números aleatórios. Não temos um números máximo de números aleatórios e isto irá depender do tipo de problema que está estudando ou ira resolver.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! VARIAVEL N SEMPRE SERA COMPARTILHADA ENTRE AS SUBROTINAS ! QUE GERAM OS NUMEROS ALEATORIOS. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! module aleatorio implicit none integer, save :: n=6677 end module aleatorio !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! PROGRAMA QUE GERAM NUMEROS ALEATORIOS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! program gna implicit none ! real :: media ! MEDIA DOS NUMEROS ALEATORIOS integer :: i,j ! UTILIZADOS NOS DO'S integer :: isemente ! SEMENTE INICIAl real :: nran ! NUMERO ALEATORIO real :: soma ! SOMA DOS NUMEROS ALEATORIOS ! write(*,*) 'Entre com a semente: ' read(*,*) isemente ! ! CHAMANDO A SUBROTINA SEMENTE call semente(isemente) ! write(*,*) '10 numeros randomicos' do i=1, 10 ! CHAMADA DO GERADOR DE NUM.ALEAT. call num_aleatorio(nran) write(*,500)nran end do ! ! write(*,*)'Media de 100 numeros aleatorios, de 5 sequencias de 100' do j=1, 5 soma = 0. do i=1,100 call num_aleatorio(nran) soma = soma + nran end do media = soma / 100.0 write(*,500) media end do ! 500 format(3x,f15.6) stop end program gna !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! GERA O NUMERO ALEATORIO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine num_aleatorio(nran) use aleatorio implicit none ! real, intent(out) :: nran n = mod( 8127*n+28417 , 134453 ) nran = real(n) / 134453.0 ! end subroutine num_aleatorio ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! TRANSFORMA A SEMENTE EM UM NUMERO POSITIVO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine semente(isemente) use aleatorio implicit none integer, intent(in) :: isemente ! n=abs(isemente) ! end subroutine semente !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
A subrotina num_aleatorio utiliza a equação , lembremos que nos dá o resto da divisão de por . O valor de n é atribuído através do número inteiro que digitamos dada pela variável isemente, o número n será base e a entrada do novo dará o número aleatório. O número aleatório de fato será por . A idéia deste código é que o resto da divisão sempre será um número compreendido entre 0 e 134453 no qual será dividido pelo número 134453, assim o número randômico poderá estar compreendido entre . Na tabela 3.8 temos a sequencia de 5 números aleatórios tendo como partida um valor da semente igual a 10. Pode ser feito esta sequência no caderno com um auxílio da calculadora, para a primeira linha veja qual o valor do resto para a divisão entre os números ( ) e que deve ser igual ao valor de n, com o valor de n divida por , assim terá o valor de nran.