segunda-feira, 19 de julho de 2010

Randomicidade randômica

Cedo ou tarde todo mundo que começa a programar se depara com as funções que geram número aleatórios ou randômicos. Bom na verdade estas funções não são realmente aleatórias, elas são pseudo geradores de números aleatórios. Geralmente estas funções usam fórmulas matemáticas ou tabelas pré-calculadas de números. Existem também formas verdadeiramente aleatórias de se gerar números, usando-se por exemplo ruído atmosférico gerado por tempestades ou fenômenos da física quântica. Neste link você pode achar um artigo bem completo falando sobre as duas formas de gerar números aleatórios.

Voltando as nossas queridas linguagens de programação cabe uma pergunta aqui, o quão randômica é a função de gerar número aleatórios de cada linguagem?
Abaixo faço uma pequena análise visual das funções mais comuns de cada linguagem para geração de números aleatórios. Disponibilizo também o código fonte usado para gerar cada imagem.
Devo dizer que é uma análise sem muito rigor e que isso não deve ser visto como crítica a uma linguagem ou outra. Como é comum que recursos do sistema operacional sejam utilizados na hora de gerar os números é útil informar que todos os testes foram feitos usando-se o Ubuntu 8.10 versão de 32 bits.

Linguagem C



Eu usei o seguinte comanado para compilar este código:

cc -o c-rand $(pkg-config --cflags --libs cairo) c-rand.c
E como você pode ver é necessário ter a biblioteca cairo instalada. No linux não deve ser muito difícil de instalá-la, no Ubuntu um 'sudo apt-get install libcairo2-dev' deve bastar.

Java


A versão da máquina virtual usada foi "1.6.0_14". Para fazer funcionar é só usar os tradicionais javac e java.

Perl



A versão do Perl utilizada foi 5.10.0. Um comando ./nomescript.pl deve ser o bastante para executar o código. Lembre-se de dar permissão de execução ao script.

PHP



A versão do PHP usado para executar foi 5.2.6. Um comando php nome_arquivo.php deve ser o suficiente para rodar.

Python



O python utilizado foi o 2.5.2. Novamente um comando do tipo python nome_arquivo.py deve rodar o código sem problemas.

Ruby



O Ruby utilizado foi o 1.8.7. Um comando ruby nome_arquivo.rb deve fazer a mágica. Note que usei a biblioteca RMagick, provavelmente você precisará instalar esta gem para rodar o código.

Concluindo
Quanto mais uniforme a figura gerada menos aleatório foi o processo de geração dos números. Uma imagem que se destaca (de forma ruim) é a imagem gerada pela linguagem Ruby. Estas imagens são bem pequenas (elas foram ampliadas), tem uma resolução de 20x20. Ou seja, a função que gera os número foi chamada somente 400 vezes (20 * 20). Você pode alterar o código que desejar aumentado a resolução da imagem gerada (basta aumentar o valor da varável TAM) para ter um panorama melhor.
Para finalizar uma pergunta: Qual das linguagens você acha que é a mais randômica?

Um comentário:

  1. Ricardo, muito legal a sua abordagem do tema!

    De fato, existem muitas formas de gerar randomicidade, algumas mais "aleatórias" do que outras.

    Em 20 anos que estudo o tema, o que me surpreendeu foi o trabalho prático do greco americano Ion Saliu. Ele conseguiu padronizar variáveis randômicas para, bem, aplicar isto com ganhos reais e subsequentes.

    É interessante sabermos que existe um vasto campo neste segmento, não apenas para ganhos monetários, mas sobretudo para a edificação do próprio perfil de planejamento futuro.

    Estou buscando a implantação de um sistema de apoio, estudos com superposição de randomicidades em critérios lógicos.

    Deste nível de interação pode-se antever interessantes aplicativos sociais.

    ResponderExcluir