66 GERAÇÃO DE NÚMEROS ALEATÓRIOS A PARTIR DE MAPAS CAÓTICOS DETERMINISTAS Antônio Carlos da Silva Filho (UNI-Facef) Irfley Andrade de Oliveira (UNI-Facef) Marco Dimas Gubitoso (IME-USP) 1 INTRODUÇÃO As origens da simulação estocástica podem ser rastreadas até uma experiência realizada no século XVIII por Georges Louis Leclerc, Conde de Buffon. Leclerc jogava, aleatoriamente, uma agulha sobre um quadro cheio de linhas paralelas desenhadas nele. A partir de suas observações, ele derivou a probabilidade de que a agulha interceptasse uma linha. Pouco depois, Pierre Simon de Laplace viu neste experimento uma maneira de obter uma estimativa estatística para o número π . William Sealy Gossett, que trabalhou com o pseudônimo de "Student", realizou experimentos de amostragem em Matemática Estatística e descobriu a célebre distribuição-t. Gossett trabalhou com números aleatórios em seus experimentos e, para gerar os números, utilizou o método Top-Hat (rotação de discos). A partir dessa época a quantidade de números aleatórios necessários nos experimentos era cada vez maior. Passou-se a estocar os números em tabelas que eram publicadas para uso dos que delas precisavam. Essa foi uma idéia de L. H. C. Tippet que, em 1927, publicou uma tabela com 40000 dígitos extraídos aleatoriamente de dados do censo americano. Ela foi publicada em "Random Sampling Numbers", Tracts for Computers, nº 15, Cambridge University Press, New York, 1927. A quantidade de números aleatórios necessários nos experimentos continuou a se expandir. Por volta de 1930, a aritmética foi sugerida para o cálculo de números aleatórios. John von Neumann, em 1946, propôs o primeiro algoritmo gerador de números pseudo-aleatórios, tendo-o chamado de “método do meio dos quadrados”. O seguinte exemplo será ilustrativo deste algoritmo (BLUM, 1986). Seja uma semente, um número com quatro casas decimais dado, como o número xo = 0,9876. Eleva-se xo ao quadrado, obtendo-se xo2 = 0,97535376. Formase, a seguir, o número x1 com as quatro casas decimais do meio: x1 = 0,5353. 67 Repete-se em seguida o procedimento, obtendo-se: x12 = 0,28654609 e x2 = 0,6546, x3 = 0,8501, x4 = 0,2670, x5 = 0,1289, etc. Constatou-se, porém, uma preponderância de pequenos valores entre os números gerados por este método, levando à elaboração de diversos outros algoritmos. Vários deles estão descritos no livro “Numerical Recipes” (PRESS, 1986) e em vários artigos espalhados pela literatura especializada (EICHENAUER-HERRMANN, 1993, 1995; L'ECUYER, 1990, 1994; TEZUKA, 1995). Utilizando aritmética, foi D. H. Lemer em 1949 que primeiro introduziu a idéia do método de congruência linear que utiliza uma equação de congruência para gerar os números. O método de solução numérica de problemas que se baseia na simulação usando variáveis aleatórias é conhecido como Método de Monte Carlo. Sua origem data de 1949, com a publicação do artigo “The Monte Carlo method” (METROPOLIS, 1949). A denominação do método provém do nome da cidade do principado de Mônaco, famosa pelo cassino homônimo. O princípio do Método de Monte Carlo já era conhecido antes da publicação do artigo de Metropolis: era utilizado, por exemplo, no tratamento de dados de amostras aleatórias em estatística. Mas a sua ampla aplicação não era viável antes do aparecimento dos computadores eletrônicos (FISHMAN, 1996). Com o avanço da informática, os cientistas começaram a utilizar o computador para gerar e armazenar números aleatórios, baseados em métodos deterministas como o de Lemer, e as tabelas perderam a sua utilidade. Quais são, então, as principais aplicações científicas destes geradores? Scheid (1989) as divide em duas categorias: simulação e amostragem. Simulação refere-se aos métodos que fornecem imitações aritméticas para fenômenos “reais”. Trata-se, em um sentido amplo, da idéia geral da Matemática Aplicada. Um conjunto de equações diferenciais pode, por exemplo, simular o vôo de um míssil. Mas, no contexto deste projeto, simulação refere-se à imitação de processos aleatórios através de métodos de Monte Carlo. Um exemplo clássico é o do movimento de um nêutron dentro das paredes de um reator, sendo o zigue-zague do seu caminho imitado pelo chamado “passeio aleatório”. Já a amostragem refere-se aos métodos de dedução das propriedades de um grande conjunto de elementos através do estudo de um pequeno subconjunto aleatório do mesmo. Assim, o valor médio de uma função f(x) sobre um intervalo 68 pode ser estimado a partir da sua média sobre um número finito de pontos aleatoriamente escolhidos no intervalo. Como a média de f(x) é, de fato, uma integral, isto nos leva à aplicação dos métodos de Monte Carlos para uma integração aproximada. Como um segundo exemplo, a localização do centro de gravidade de um conjunto de N pontos aleatórios sobre o círculo unitário, pode ser encontrado estudando algumas centenas ou milhares de pontos como amostra. Deve-se notar que o que pode ser considerado aleatório para uma aplicação pode não o ser para outra. Apesar disto, podemos pensar em casos ideais; para este limite, existem alguns testes estatísticos e os bons geradores de números “aleatórios” deveriam passar por estes testes. 2 MATERIAIS E MÉTODOS Números que são produzidos por algum processo de natureza probabilista são conhecidos como números aleatórios. Exemplos de tais processos são: sorteio de bolas numeradas numa loteria, roletas nos cassinos, lançamento de moedas, lançamento de dados, etc. Em uma seqüência de números aleatórios, cada elemento é independente dos demais, e cada subseqüência é também independente das demais, sendo impossível qualquer tipo de previsão. De um conjunto de números a serem gerados aleatoriamente, cada elemento é igualmente provável de ser escolhido, por exemplo, em um lançamento de um dado (cúbico), o conjunto de números possíveis de se ocorrer é {1,2,3,4,5,6}, cada elemento desse conjunto é igualmente provável de ocorrer, ou seja, a probabilidade de ocorrer qualquer número é 1 = 0,1 6 , desta forma uma seqüência de números aleatórios tem um distribuição 6 uniforme. Sobre os geradores aritméticos, os algoritmos manipulados no computador vão gerar uma seqüência de números matematicamente calculada, deterministamente prevista, conforme uma regra prefixada. Cada número da seqüência é usado para gerar o seguinte; logo, é necessário fixar um número para começar a seqüência: este número é conhecido como “semente”. Obviamente, há aí uma limitação: como trabalhamos com um número finito de casas decimais, após algum tempo poderemos recair em algum dos números previamente gerados, 69 repetindo, então a seqüência a partir daí, deixando de obter números verdadeiramente aleatórios, pois se instala uma periodicidade. Como um exemplo simples, se estamos obtendo números entre 0,000 e 1,000, com uma precisão de três casas decimais, mesmo que os primeiros mil e um números sejam diferentes, o milésimo segundo repetirá, necessariamente, algum dos anteriores. Mas pode ser que esta repetição aconteça antes desta posição. Ocorre que, para propósitos práticos, os números são gerados com várias casas decimais, não sendo necessário usar toda a seqüência deles até que algum se repita. Se usarmos oito casas, seremos capazes de gerar até cem milhões de números diferentes! Com a utilização desses geradores determinísticos têm-se vantagens evidentes: fica mais fácil corrigir programas de simulação, quando surgir algum tipo de erro, se a execução deste programa puder ser exatamente repetida, até que se encontre o ponto onde estiver ocorrendo o problema; além disso, em problemas onde se tem a comparação de abordagens alternativas, esta comparação pode ser feita com mais precisão se ambas forem simuladas sob as mesmas influências aleatórias externas. Mas prendendo-se às propriedades dos números verdadeiramente aleatórios, o objetivo é regularizar as seqüências de números pseudo-aleatórios de modo que venha a ser mais uniformemente distribuída e assim tornar os elementos da seqüência independentes dos demais, e conseqüentemente as subseqüências independentes das demais também. O procedimento é bem simples. Tomam-se números “aleatórios” gerados por um processo determinista caótico, como o do mapeamento logístico, e, após a multiplicação por uma potência de dez, considera-se apenas a parte decimal do número resultante. Chamaremos de fator de multiplicação a estas potências de 10. 3 RESULTADOS Os resultados que serão apresentados a seguir originam-se da aplicação do algoritmo explicitado acima no gerador de números pseudo-aleatórios do MatLab, que cria números aleatórios a partir da função rand. 70 De uma seqüência de números aleatórios gerados por rand, os gráficos de retorno que seguem criam pontos associando cada elemento em função do seu antecessor. Na figura 3.1, foram gerados 270 pontos. 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Figura 3.1 – Gráfico de retorno com 270 pontos gerados aleatóriamente. Na figura 3.2, foram gerados 2845 pontos. 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 71 Figura 3.2 – Gráfico de retorno com 2845 pontos gerados aleatóriamente. Na figura 3.3, foram gerados 29347 pontos. 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Figura 3.3 – Gráfico de retorno com 29347 pontos gerados aleatóriamente. De uma seqüência de números aleatórios gerados através de uma fórmula de recorrência logística, os gráficos de retorno que seguem criam pontos associando cada elemento em função do seu antecessor. Na figura 3.4, foram gerados números aleatórios até se obter 500 pontos para o mapeamento logístico (figura 3.4). 72 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Figura 3.4 – Gráfico de retorno com 500 pontos gerados pelo mapeamento logístico. Na figura 3.5, foram gerados 3603 pontos. 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 73 Figura 3.5 – Gráfico de retorno com 10.000 pontos gerados pelo mapeamento logístico. Frequência de pontos, em cada um dos dez intervalos em que se dividiu o intervalo [0, 1], para o mapeamento logistico Total de pontos = 10.000 22 20 18 frequência 16 14 12 10 8 6 1 2 3 4 5 6 intervalos de 0 a 1 7 8 9 10 Figura 3.6 – Gráfico com a frequências em cada intervalo de um total de 10 intervalos em que foi dividido o intervalo [0, 1]. 10.000 pontos gerados pelo mapeamento logístico. 17 16 15 14 13 12 11 10 9 8 1 2 3 4 5 6 7 8 9 10 Figura 3.7 – Gráfico com a frequências em cada intervalo de um total de 10 intervalos em que foi dividido o intervalo [0, 1]. 10.000 pontos gerados pelo mapeamento logístico e fator de multiplicação igual a 100. 74 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Figura 3.8 – Gráfico de retorno com 10.000 pontos gerados pelo mapeamento logístico e fator de multiplicação igual a 100. 10.8 10.6 10.4 10.2 10 9.8 9.6 9.4 9.2 1 2 3 4 5 6 7 8 9 10 Figura 3.9 – Gráfico com a frequências em cada intervalo de um total de 10 intervalos em que foi dividido o intervalo [0, 1]. 10.000 pontos gerados pelo mapeamento logístico e fator de multiplicação igual a 100.000. 75 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Figura 3.10 – Gráfico de retorno com 10.000 pontos gerados pelo mapeamento logístico e fator de multiplicação igual a 100.000. 4 ANÁLISE E CONCLUSÃO 76 De acordo com os gráficos obtidos, podemos verificar que os pontos se espalham uniformemente pelo plano. Podemos então concluir que, evidentemente, os números da seqüência regularizada estão mais uniformemente espalhados que os da seqüência original, e que se analisarmos cada elemento em relação aos demais verificamos que não existe correlação entre eles. E ainda que uma subseqüência da seqüência regularizada também é independente das demais. Para aplicações em que necessitam de uma seqüência de números verdadeiramente aleatórios, esse algoritmo pode, a partir de um gerador caótico determinístico, regularizar a seqüência gerada por ele, de tal forma que a seqüência fique mais uniformemente distribuída e com os elementos independentes, aproximando assim das propriedades dos números verdadeiramente aleatórios, o que vai melhorar o resultado da aplicação em relação do uso de uma seqüência pseudo-aleatória. REFERÊNCIAS BLUM, L.; BLUM, M.; SCHUB, M. A simple unpredictable pseudo random number generator. SIAM Journal on Computing, v. 15(2), p. 364-383, 1986. DORICIO, J. L. Números Randômicos e Aplicações. Disponível em: br.geocities.com/josedoricio/documentos/RandomNumbers1.pdf. Acesso em: 02 de maio 2008. EICHENAUER-HERRMANN, J. Statistical independence of a newclass of inversive congruential pseudorandom numbers. Mathematics of Computation, v. 60, p. 375384, 1993. EICHENAUER-HERRMANN, J. Pseudorandom number generation by nonlinear methods. International Statistical Reviews, v. 63, p. 247-255. 1995. FISHMAN, G. S. Monte Carlo: Concepts, Algorithms, and Applications. Springer Series in Operations Research. New York: Springer-Verlag, 1996. KNUTH, D. E. The Art of Computer Programming, v. 2: Seminumerical Algorithms. 2. ed. Reading, Massachusetts: Addison-Wesley, 1981. 784 p. 77 HANSELMAN, Duane; LITTLEFIELD, Bruce. Matlab 6 – Curso Completo. São Paulo: Prentice Hall, 2003. 676 p. L'ECUYER, P. Random numbers for simulation. Communications of the ACM. v. 33(10), p. 85-97, 1990. L'ECUYER, P. Testing random number generators. In Proceedings of the 1992 Winter Simulation Conference, IEEE Press., p. 305-313, 1992. L'ECUYER, P. Uniform random number generation. Annals of Operations Research, v. 53, p. 77-120, 1994. METROPOLIS, N.; ULAM, S. The Monte Carlo Method. J. Amer. Statistical Assoc., 1949, v. 44, p. 335-341. MARSAGLIA, George. Diehard: a battery of tests of randomness. 1996. Disponível em: http://stat.fsu.edu/~geo/diehard.html. Acesso em: 20 março 2007. PRESS, William H. Numerical Recipes. Cambridge: Cambridge University Press, 1986. 818 p. TEZUKA, S. 1995. Uniform Random Numbers: Theory and Practice. Norwell, Massachusetts: Kluwer Academic Publishers, 1995. 228 p.