garotosopa

Curiosidade aleatória

com 5 comentários

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:

<?php
$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?

Escrito por garotosopa

outubro 4, 2010 às 8:46 am

Publicado em Diversos

5 Respostas

Assinar os comentários com RSS.

  1. 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

  2. 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

  3. 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

  4. 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

  5. Valeu, Murilo! É sempre bom ter um pouco de ciência por perto =D

    garotosopa

    janeiro 10, 2012 em 2:34 pm


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.