76 CONSTRUINDO GERADORES DE NÚMEROS ALEATÓRIOS A PARTIR DE MAPAS CAÓTICOS DETERMINISTAS Ana Cláudia Lima (Uni-FACEF) Antonio Carlos da Silva Filho (Uni-FACEF) INTRODUÇÃO As origens da simulação estocática 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 linha 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 π. 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 Carlos 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). 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. Um dos problemas científicos mais importantes começou a se manifestar após o surgimento, na década de cinqüenta, dos primeiros computadores eletrônicos, pois ficou evidente a necessidade de dispor de grandes quantidades destes números num curto espaço de tempo. O que, à primeira vista, poderia parecer uma solução natural para esta questão, revelou-se pouco prático: o armazenamento prévio, na memória do computador, de imensas quantidades destes 76 77 números, gerados por qualquer dos processos verdadeiramente aleatórios descritos acima. A exigência de muito espaço disponível nas memórias dos computadores, principalmente nos primeiros tempos da era computacional, constituiu o empecilho mais sério para sua utilização. Assim, foram desenvolvidos métodos matemáticos para a geração, através de processos deterministas, de números “aleatórios” dentro do próprio computador. Havia vantagens evidentes neste tipo de procedimento: ficava mais fácil corrigir programas de simulação, quando surgia algum tipo de erro, se a execução deste programa pudesse ser exatamente repetida, até que se encontrasse o ponto onde estivesse ocorrendo o problema; além disso, em problemas onde havia a comparação de abordagens alternativas, esta comparação poderia ser feita com mais precisão se ambas fossem simuladas sob as mesmas influência aleatórias externas. Como são feitas as simulações? 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, repetindo, então a seqüência a partir daí, deixando de obter números verdadeiramente aleatórios, pois se instala uma periodicidade. Como um exempo 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! Como testar se os números gerados são uniformemente espalhados pelo intervalo [0, 1]? A literatura da área está repleta de testes (L'ECUYER, 1992), sendo os mais importantes o “The Scalable Parallel Random Number Generators Library (SPRNG)” e os testes DIEHARD (MARSAGLIA, 1996). Este trabalho não se propõe 77 78 a construir algum novo gerador de números aleatórios, mas a construir um algoritmo que, a partir dos números gerados por qualquer gerador existente, redistribua os números gerados de maneira a preencher uniformemente o intervalo [0, 1]. Os números assim redistribuídos serão, posteriormente, submetidos aos testes DIEHARD. Devido ao fato de os números estarem uniformemente redistribuídos, espera-se bons resultados com estes testes. 1 MATERIAIS E MÉTODOS Imagine-se uma caixa com dez bolas numeradas de 0 a 9. Sorteia-se uma bola e, após repô-la na caixa, faz-se um novo sorteio. Repetindo-se o processo um grande número de vezes, espera-se chegar às freqüências do quadro abaixo: Número Freqüência 0 1 2 3 4 5 6 7 8 9 0,1 0,1 0,1 0,1 0,1 0,1 0,1 0,1 0,1 0,1 Nem sempre a lei expressa na tabela acima ocorre nos experimentos aleatórios do mundo real. Assim, criaram-se testes estatísticos especiais, que partirão da hipótese de que as freqüências dos dígitos sorteados segue a tabela acima. Um dos testes mais simples baseia-se na soma: 9 ∑( f I =0 i − 0,1 N ) 2 onde N é o número de algarismos sorteados fi é a quantidade de vezes em que o algarismos i foi sorteado. A teoria da probabilidades permite deduzir em que limites deverá estar compreendida esta soma. J. von Neumann propôs o primeiro algoritmo gerador de números pseudoaleatórios no computador, 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. 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 78 79 livro “Numerical Recipes” (PRESS, 1986) e em vários artigos espalhados pela literatura especializada (EICHENAUER-HERRMANN, 1993, 1995; L'ECUYER, 1990, 1994; TEZUKA, 1995). 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”. 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. 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. O que este projeto propõe é a construção de geradores de números aleatórios. Tal construção será feita através da combinação de mapas caóticos, simples de serem gerados, mesmo numa calculadora de mão. Parte do trabalho será gasto na construção de algoritmos que explicitem este procedimento e parte no teste dos resultados dos algoritmos. Knuth (1981) descreve um conjunto de testes considerados como “padrões” para os geradores de números aleatórios. Marsaglia (1996) propôs uma bateria de testes denominados DIEHARD, que podem ser considerados mais exigentes do que os testes clássico de Knuth (1981). Este último conjunto de testes será o que será utilizado. 3 RESULTADOS Um mapa caótico, como o Mapa Logístico xn+1 = kxn(1 – xn) não produz séries numéricas, mesmo na região em que o parâmetro k tenha um valor que produza o caos, com as características das séries aleatórias. Isto pode ser exemplificado nos dois diagramas construídos com números gerados no computador: (a) no primeiro gráfico, os números são obtidos a partir de um gerador 79 80 de números aleatórios presente no programa Matlab; (b) no segundo gráfico, os números são obtidos a partir do mapeamento logístico acima, com k igual a 4. Espera-se, para um bom gerador, que preencha uniformemente o espaço do gráfico, o que não ocorre para o Mapa Logístico. (a) Diagrama para números obtidos com um gerador de números aleatórios: 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 Fig. 1 Diagrama de retorno para uma variável aleatória uniforme. (b) Diagrama para números obtidos com o Mapa Logístico, para k = 4: 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 80 0.5 0.6 0.7 0.8 0.9 1 81 Fig. 2 Diagrama de retorno para o Mapa Logístico. A frequência com que os números caem em cada um dos dez intervalos de igual amplitude em que se pode dividir o intervalo [0, 1] varia de acordo com a quantidade de pontos; para 10.000 pontos obtivemos os seguintes números: 1951 929 742 660 628 663 667 791 890 2079 distribuição que é bastante desigual. Isto pode ser visualizado na figura 3 a seguir: 30 Porcentagem de pontos 25 20 15 10 5 0 1 2 3 4 5 6 intervalos 7 8 9 10 Fig. 3 Porcentagem de pontos em cada um dos dez intervalos iguais em que se divide o intervalo [0, 1], para 10.000 pontos do Mapa Logístico. A linha azul indica a porcentagem esperada para variáveis aleatórias uniformemente distribuídas. 81 82 Um outro sistema discreto é o sistema de Hénon, introduzido na literatura pelo astrônomo francês M. Hénon em 1974. Este é um mapa bidimensional definido pelas seguintes equações: Xn+1 = 1 – a(Xn)2 + Yn Yn+1 = bXn onde, usualmente: a = 1,4; b = 0,3. Hénon provou que o comportamento deste sistema depende das condições iniciais: ou as variáveis vão para o infinito ou para a estrutura exibida na figura 4 a seguir: 0.4 0.3 0.2 y 0.1 0 -0.1 -0.2 -0.3 -0.4 -1.5 -1 -0.5 0 x 0.5 1 1.5 Fig. 4 Mapa de Hénon para a = 1,4 e b = 0,3. O Mapa de Hénon é caótico no sentido de que as sequências de pontos obtidos para ele serão diferentes para diferentes condições iniciais. Apesar disto, a aparência geral do mapa não se altera se mudarmos estas condições. Quando procuramos as frequências com que os valores da variável x se apresentam ao 82 83 dividirmos o intervalo [-1,5; 1,5] em dez subintervalos iguais, encontramos, para um total de 10.000 pontos, os seguintes valores: 251 689 637 1016 784 853 1829 1675 1621 645 os quais podem ser melhor visualizados na figura 5 a seguir: 30 25 porcentagem 20 15 10 5 0 1 2 3 4 5 6 intervalos 7 8 9 10 Fig. 5 Porcentagem de pontos em cada um dos dez intervalos iguais em que se divide o intervalo [-1,5; 1,5], para 10.000 pontos do Mapa de Hénon. A linha azul indica a porcentagem esperada para variáveis aleatórias uniformemente distribuídas. Mas, o que acontece quando construímos um diagrama de retorno para a variável x? Se notarmos que, para o Mapa de Hénon, xn-1 e yn são proporcionais, podemos esperar obter a mesma figura, apenas rodada em relação à original e dilatada no eixo xn-1, o que, visualmente, pode ser anulado por um reescalonamento dos eixos. O mesmo se aplica se construirmos um diagrama de retorno para a variável y. Desta maneira, não é de estranhar que se obtenha, para o diagrama de retorno do Mapa de Hénon, a figura 6 a seguir: 83 84 1.5 1 x(n) 0.5 0 -0.5 -1 -1.5 -1.5 -1 -0.5 0 x(n-1) 0.5 1 1.5 Fig. 6 Diagrama de retorno para a variável x do Mapa de Hénon. Uma primeira possibilidade de gerar, a partir de mapas caóticos, números verdadeiramente aleatórios, é construir uma sequência secundária, a partir da sequência primária obtida do mapeamento, onde haja um retardo entre os elementos sucessivos. Este retardo pode ser de um valor, de dois ou, em geral, de k valores. Assim, por exemplo, a partir da sequência original: S1 = {a1, a2, a3, ... , an} obtém-se, com um retardo de k valores, a sequência alterada: S2 = {a1, a1+k, a1+2k, ... , am} com m ≤ n. Assim, com k = 2, obtemos a figura abaixo: 84 85 1.5 1 x(n) 0.5 0 -0.5 -1 -1.5 -1.5 -1 -0.5 0 x(n-2) 0.5 1 1.5 0 x(n-10) 0.5 1 1.5 Fig. 7 Diagrama de retorno, com k=2. Já para k=10, obtemos: 1.5 1 x(n) 0.5 0 -0.5 -1 -1.5 -1.5 -1 -0.5 Fig. 8 Diagrama de retorno, com k=10. 85 86 Para k=20, obtemos a figura abaixo: 1.5 1 x(n) 0.5 0 -0.5 -1 -1.5 -1.5 -1 -0.5 0 x(n-20) 0.5 1 1.5 Fig. 9 Diagrama de retorno, com k=20. 4 ANÁLISE E CONCLUSÃO De acordo com os gráficos obtidos, podemos verificar que, pela maneira com que a sequência foi construída, os pontos se espalham de maneira mais uniforme pelo plano. Podemos então concluir, numa primeira aproximação, que esta é uma maneira melhor de gerar números pseudo-aleatórios. 86 87 BIBLIOGRAFIA BLUM, L.; BLUM, M.; SCHUB, M. A simple unpredictable pseudo random number generator. SIAM Journal on Computing, v. 15(2), p. 364-383, 1986. 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. 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. 87 88 TEZUKA, S. 1995. Uniform Random Numbers: Theory and Practice. Norwell, Massachusetts: Kluwer Academic Publishers, 1995. 228 p. 88