Curiosidade aleatória
Durante um almoço recente, meu grande camarada Lawrence Lagerlof e eu tivemos uma dúvida de probabilidade, e resolvemos fazer o que qualquer homem da ciência faria: uma aposta boba.
A questão girava em torno de 1 chance em 100 de algo acontecer. A declaração por si só já afirma quais as chances de acerto, mas, em média, quantas tentativas realmente são necessárias pra tirar a sorte grande?
Eu achava que uma média não existia. Diferentes amostragens apontariam diferentes resultados, sem que fosse possível determinar com precisão a média de tentativas até conseguir um acerto.
Lawrence achava que não, que a média seria a metade do número de opções. Isto é, ao jogar um dado de 6 lados, seriam necessárias, em média, outras 3 jogadas pra conseguir tirar o mesmo lado.
Apostamos então que sortearíamos um número de 1 a 100 e calcularíamos a quantidade de vezes para achar o mesmo número, repetindo o cálculo 100.000 vezes para então tirar a média. Se a média ficasse na metade, entre 45 e 55 vezes, Lawrence ganharia a aposta. Qualquer outro resultado a vitória seria minha.
Assim que voltamos do almoço, preparamos o seguinte script:
$conjunto = 100;
$testes = 100000;
$numero = rand(1, $conjunto);
$soma_vezes = 0;
for ( $i = 0; $i < $testes; $i++ ) {
for ( $sorteado = null, $vezes = 0; $sorteado !== $numero; $vezes++ ) {
$sorteado = rand(1, $conjunto);
}
$soma_vezes += $vezes;
}
$media = $soma_vezes / $testes;
echo "Média: $media\n";
Para nossa surpressa, o resultado foi 100.
Consistentemente, a quantidade média de tentativas para acertar um número dentro de um conjunto é o tamanho do próprio conjunto.
Logo que viu o resultado, Lawrence repensou sua aposta e concordou que realmente faz todo sentido, perdera por pura distração. Já eu estou sem entender até agora, realmente achava que não seria possível ter uma média fiel. Afinal, 1 chance em 100 pode ocorrer de primeira ou levar mil vezes pra acontecer.
Fizemos outros testes com conjuntos menores e maiores e o resultado era sempre 100% a quantidade de possibilidades, com apenas alguns décimos de diferença.
O curioso é que essa média é atingida rapidamente, nem precisa dos 100.000 testes, como demonstrado no gráfico abaixo.

Mas isso considerando a média aritmética, que é facilmente desequilibrada quando um teste azarado leva muito tempo para encontrar o número sorteado. Se considerarmos a moda dos resultados, ou seja, a quantidade de vezes tentadas mais observada, o gráfico fica mais favorável pro apostador.

Olhando por esse lado, sinto-me na obrigação de devolver os R$ 5 que ganhei. Até porque ele ainda acertou ao sugerir que o resultado seria previsível, enquanto eu insistia que seria sempre aleatório.
Devo declará-lo vencedor ou aposta é aposta?

Opa, beleza… Não sei se o resultado é o mesmo utilizando a função rand() no PHP (http://www.boallen.com/random-numbers.html).
Se você testar utilizando o Randon.org o resultado é o mesmo?
Rodrigo Sebold
outubro 4, 2010 em 9:12 am
Fala, Rodrigo! Bem observado.
Tentei baixar uma lista de alguns milhares de números aleatórios de 1 a 100 nesse random.org mas esgotei minha cota e não consegui números suficientes. Pra fazer os 100.000 testes precisaria de mais de 10 milhões de números.
Mas eu fiz o teste do artigo que você mencionou, gerando aquela imagem pelo rand() do PHP, e ela não saiu com aqueles padrões que sugeriam que a função não é tão aleatória. Ou seja, aqui a função deve estar aleatória o suficiente.
E por curiosidade, rand() e mt_rand() deu no mesmo.
garotosopa
outubro 4, 2010 em 7:59 pm
O resultado é bacana, embora seja explicado em estatística.
Por isso uma forma curiosa de se montar um algoritmo que rode, mais ou menos, a cada 100 acessos é colocando ele numa estrutura condicional assim:
if (mt_rand(1, 100) == 1) {
…
}
Aliás, sugere-se usar mt_rand ao invés de rand. A função é idêntica, mas a implementação é melhor.
Rubens Takiguti Ribeiro
agosto 9, 2011 em 5:10 pm
Olá Sopa,
Este comportamento observado por vocês é explicado pela probabilidade sim! Existe meios de calcular esse valor que vocês calcularam através de teoria.
O seu experimento consiste em uma distribuição geométrica [0], ou seja, você quer saber a quantidade de experimentos até conseguir o primeiro acerto (ou seja o número de erros + 1). No caso seu acerto é bater com um do conjunto {1, 2, …, 100}. Como a distribuição desse conjunto é uniforme (ou seja, qualquer numero tem probabilidade igual de sair), então a probabilidade *p* de acerto em uma jogada é *1/100*.
Como você quer saber a média de tentativas nesse experimentos, utilizamos a esperança (E) [1] que nada mais é que a média aplicada sobre probabilidades. A esperança (ou valor esperado) de uma distribuição geométrica (que é o caso do seu experimento) é dada por:
E(X) = 1/p, onde p é a probabilidade de sucesso
Voltando ao problema, temos que *p = 1/100*, então
E(X) = 1/(1 / 100) = 100
Que é exatamente o valor que vocês encontraram com seus experimentos.
Bom, espero não ter acabado com a mágica da sua curiosidade :)
[0] Distribuição geométrica – http://pt.wikipedia.org/wiki/Distribui%C3%A7%C3%A3o_geom%C3%A9trica
[1] Valor esperado – http://pt.wikipedia.org/wiki/Valor_esperado
Murilo Adriano
janeiro 10, 2012 em 9:30 am
Valeu, Murilo! É sempre bom ter um pouco de ciência por perto =D
garotosopa
janeiro 10, 2012 em 2:34 pm