If you're seeing this message, it means we're having trouble loading external resources on our website.

Se você está atrás de um filtro da Web, certifique-se que os domínios *.kastatic.org e *.kasandbox.org estão desbloqueados.

Conteúdo principal

Probabilidade & distribuições não uniformes

Você se lembra de quando começou a programar aqui? Talvez você quisesse desenhar um monte de círculos na tela. E aí, você disse para você mesmo “Ah, já sei. Vou desenhar todos esses círculos em posições aleatórias, com tamanhos e cores aleatórias”. Em um sistema gráfico de computador, geralmente é mais fácil aplicar a aleatoriedade. Contudo, nessas lições, queremos criar sistemas modelados de acordo com o que vemos na natureza. Usar a aleatoriedade não é uma solução pensada para um problema de design — especialmente para o tipo de problema que envolve a criação de uma simulação orgânica ou com aparência natural.
Com alguns truques, podemos mudar a forma como usamos random() para produzir distribuições “não uniformes” de números aleatórios. Isso será útil durante o curso, pois veremos vários cenários diferentes. Quando examinamos algoritmos genéricos, por exemplo, precisamos de uma metodologia para fazer a “seleção” — quais membros de nossa população devem ser selecionados para transmitirem seu DNA à próxima geração? Lembra do conceito de sobrevivência do mais apto? Digamos que temos uma população de macacos evoluindo. Nem todos os macacos têm a mesma chance de se reproduzir. Para simular a evolução darwiniana, podemos simplesmente escolher dois macacos aleatórios para terem um filhote. Precisamos que os mais “aptos” tenham maior chance de serem escolhidos. Precisamos definir a “probabilidade do mais apto”. Por exemplo, um macaco excepcionalmente forte e rápido pode ter uma chance de 90% de procriar, enquanto um mais fraco tem uma chance de apenas 10%.
Vamos fazer uma pausa e ver os princípios básicos da probabilidade. Primeiro, examinaremos a probabilidade de um evento único, isto é, a probabilidade de um evento específico acontecer.
Se você tiver um sistema com um determinado número de resultados possíveis, a probabilidade da ocorrência de um evento específico é igual ao número de resultados que se qualificam como sendo este evento dividido pelo número total de todos os resultados possíveis. Lançar uma moeda é um exemplo simples — há apenas dois resultados possíveis, cara ou coroa. Há apenas uma forma do resultado ser cara. A probabilidade de se obter cara, portanto, é um dividido por dois: 1/2 ou 50%.
Pegue um baralho de cinquenta e duas cartas. A probabilidade de tirar um ás do baralho é de:
número de ases / número de cartas = 4 / 52 = 0,077 = ~ 8%
A probabilidade de tirar uma carta de ouros é:
número de ouros / número de cartas = 13 / 52 = 0,25 = 25%
Também podemos calcular a probabilidade de vários eventos acontecerem em sequência. Para fazer isso, basta multiplicar as probabilidades individuais de cada evento.
A probabilidade de, jogando uma moeda, se obter cara três vezes seguidas é de:
(1/2) * (1/2) * (1/2) = 1/8 (ou 0,125)
…o que significa que o resultado obtido será cara três vezes seguidas em uma a cada oito vezes (sendo que cada “vez” representa três lances).
Quer fazer uma revisão sobre probabilidade antes de continuar? Study compound events and dependent probability.
Existem algumas formas de usar a função random() com probabilidade na programação. Uma técnica é preencher um array com alguns números — alguns deles repetidos — e depois escolher números aleatórios do array e gerar eventos com base nessas escolhas.
A execução deste código produzirá uma chance de 40% de imprimir o valor 1, uma chance de 20% de imprimir 2 e de 40% de imprimir 3.
Também podemos solicitar um número aleatório (vamos simplificar e apenas considerar valores decimais aleatórios entre 0 e 1) e permitir que ocorra um evento apenas se nosso número aleatório estiver dentro de um intervalo específico. Veja o exemplo abaixo e continue clicando em reiniciar até que o número escolhido aleatoriamente esteja finalmente abaixo do limite:
Este método também pode ser aplicado a vários resultados. Digamos que o Resultado A tenha uma chance de 60% de acontecer, o Resultado B de 10%, e o Resultado C de 30%. Vamos implementar isso no código escolhendo um número aleatório e vendo em qual intervalo ele se encaixa.
  • entre 0,00 e 0,60 (60%) –> Resultado A
  • entre 0,60 e 0,70 (10%) –> Resultado B
  • entre 0,70 e 1,00 (30%) –> Resultado C​__
Clique no botão reiniciar para ver a frequência em que ocorrem resultados diferentes:
Podemos usar a metodologia acima para criar um movimento aleatório que tende a seguir para a direita. Este é um exemplo de um Walker com as seguintes probabilidades:
  • chance de ir para cima: 20%
  • chance de ir para baixo: 20%
  • chance de ir para esquerda: 20%
  • chance de ir para direita: 40%

Este curso "Natural Simulations" é um derivado do "The Nature of Code" por Daniel Shiffman, usado sob a Creative Commons Attribution-NonCommercial 3.0 Unported License.

Quer participar da conversa?

Você entende inglês? Clique aqui para ver mais debates na versão em inglês do site da Khan Academy.