PARTE 2: COMO OS COMPUTADORES GERAM NÚMEROS ALEATÓRIOS?

Na verdade, a maioria dos computadores digitais domésticos atuais não geram números aleatórios. O que estes computadores fazem é usar um algoritmo para produzir números (denominados pseudoaleatórios) que “simulam” o comportamento de números aleatórios. Já existem no mercado equipamentos que, através de fenômenos físicos, procuram gerar números “mais aleatórios”. Contudo, estes equipamentos ainda são caros.

Mais ainda: definir o que se entende por um número ou evento aleatório é ainda uma questão polêmica, sendo debatida por psicólogos, filósofos, matemáticos, físicos e cientistas da computação. Por exemplo, você pode pensar que o lançamento de uma moeda honesta pode gerar um evento aleatório com probabilidade “1/2” para cara e probabilidade “1/2” para coroa. Mas o lançamento de uma moeda é um processo determinístico (complexo, mas ainda determinístico), regido pelas leis da Física. De fato, o artigo [Diaconis, Holmes, Montgomery, 2007] descreve um experimento onde, através de um ajuste de velocidade inicial e momento angular, uma moeda lançada por uma máquina sempre dá como resultado cara. Para saber mais sobre as diferentes definições de aleatoriedade sugeridas atualmente, recomendamos os excelentes artigos [Volchan, 2002] e [Volchan, 2004]

Um dos algoritmos mais simples para se gerar números pseudoaleatórios (e ainda muito usado em vários programas de computador) é o assim denominado gerador congruente linear (GCL), apresentado por D. H. Lehmer em 1949: considere números inteiros m, a, c e s tais que m > 0, 0 ≤ a < m, 0 ≤ a < m e 0 ≤ s < m. Colocando x0 = s, defina recursivamente para cada inteiro n ≥ 0:

xn + 1 = (a xn + c) mod m,

isto é, xn + 1 é o resto da divisão de a xn + c por m. Por exemplo, se m = 10, a = 11, c = 3 e x0 = s = 3, então a x0 + c = 36. Como o resto da divisão de 36 por 10 é 6, segue-se que x1 = 6. Sendo assim, a x1 + c = 69. Como o resto da divisão de 69 por 10 é 9, segue-se que x2 = 9. Prosseguindo-se com este esquema, a partir do número x0 = 3, geramos os números x1 = 6, x2 = 9, x3 = 2, x4 = 5, x5 = 8, x6 = 1, x7 = 4, x8 = 8, x9 = 0, x10 = 3. Note que depois de x10, a sequência de números gerados se repete (com período 10).

Com o aplicativo abaixo, você pode gerar números pseudoaleatórios usando o algoritmo GCL: indique os valores das constantes m, a, c, s e, então, pressione sucessivamente o botão “Próximo!” para calcular o próximo elemento da sequência. O botão “Reiniciar!” reinicia a sequência de números pseudoaleatórios a partir do primeiro termo.


m: a: c: s:
 

As constantes m, a e c são escolhidas seguindo basicamente dois critérios: (1) o método deve gerar um grande número de valores diferentes (isto é, o período da sequência deve ser longo) e (2) o método deve gerar números rapidamente. A tabela abaixo ilustra alguns valores sugeridos para as constantes m, a e c. Os GCLs geram números inteiros positivos entre 0 e m. Para gerar números decimais entre 0 e 1, basta dividir os números gerados por m.

a m c Referência
16807 2147483647 0 Lewis, Goodman e Miller
39373 2147483647 0 L'Ecuyer
742938285 2147483647 0 Fishman e Moore
950706376 2147483647 0 Fishman e Moore
1226874159 2147483647 0 Fishman e Moore
40692 2147483399 0 L'Ecuyer
40014 2147483563 0 L'Ecuyer

Os geradores congruentes lineares são rápidos e usam pouco memória do computador. Contudo, dependendo da aplicação, o seu uso não é recomendável. Um defeito grave dos GCLs é que os números gerados possuem uma correlação: triplas de números gerados pertencem a um determinado número de planos. Você pode verificar este fato na Parte 5 (3D) (use m = 2147483648, a = 65539, c = 0 e s = 1) ou na Parte 4 (2D) (use m = 509, a = 128, c = 0 e s = 1). Dado a este defeito, especialistas não recomendam o emprego de um GCL, por exemplo, em criptografia: o fato das triplas de números gerados pertencerem a um determinado número de planos pode ser explorado por um hacker para descobrir os valores dos parâmetros m, a, c e s. Isto aconteceu com o antigo navegador de internet Netscape em 1995: dois alunos da Universidade de Berkeley nos Estados Unidos conseguiram descobrir o algoritmo usado pelo navegador. Existem outros algoritmos que geram números pseudoaleatórios apropriados para criptografia. Eles são mais lentos, mais são mais seguros.

Vários outros geradores de números pseudoaleatórios foram propostos: Mersenne Twister (usado no PlayStation 3 e com período 219937 − 1), Blum Blum Shub (usado em criptografia), Xorshift de George Marsaglia, etc.


Dúvidas? Sugestões? Nós damos suporte! Contacte-nos pelo e-mail:
conteudosdigitais@im.uff.br.