
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.