quinta-feira, 18 de agosto de 2011

Da multiplicação de números aleatórios

Cuidado: esse post contém matemática, mas nada de muito difícil.

Essa tirinha, do Vida de Programador, fala em multiplicar dois números aleatórios para obter um número mais aleatório. Parece um tanto óbvio que isso é uma boa ideia, não?

Acontece que isso não funciona da forma esperada, e pode em alguns casos até diminuir a aleatoriedade dos números.

Não sei estatística o suficiente para provar de forma formal (e pelo que eu pesquisei isso vai inclusive cair em algumas contas meio tensas - o Mathematica inclusive não dá uma forma fechada para esse produto), mas de forma informal pode ser feito utilizando Python + SciPy, ou qualquer outra linguagem de programação.

Primeiro, geram-se 2 vetores seguindo a distribuição uniforme (a mais usada pelo 'random' das linguagens de programação). Após, multiplicam-se ambos, e o resultado não tem nada uniforme - aliás, parece mais exponencial, não? A mesma coisa com a soma. Vamos aos gráficos (n = 10000):





























Pior ainda é multiplicar muitos números aleatórios, o que gera uma tendência extrema. Esse exemplo com 6 números aleatórios (n = 500000) demonstra:















Então, tem-se que multiplicar números aleatórios modifica a distribuição deles. Pode ser que isso seja desejável ou não vá afetar nosso problema, pode ser que não: que eles adicionem um viés, por exemplo num jogo, numa simulação, ou na seleção de propagandas a serem colocadas em um site.

Números "mais aleatórios"? Só com geradores de números aleatórios por hardware, por exemplo este, ou usando dispositivos como o /dev/random. Mas não a solução do nosso querido POGramador.

O código Python? Tem aqui.

Nenhum comentário:

Postar um comentário

Não são lidos e não me responsabilizo pelo conteúdo deles.