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

Distribuição personalizada de números aleatórios

Vai chegar um momento em sua vida que você não vai mais querer uma distribuição uniforme de valores aleatórios, ou uma Gaussiana. Vamos imaginar por um momento que você é um caminhante aleatório em busca de comida. Mover-se aleatoriamente em torno de um espaço parece ser uma estratégia razoável para encontrar algo para comer. Até porque você não sabe onde a comida está, então você também pode procurar aleatoriamente até encontrá-la. O problema, como você deve ter notado, é que caminhantes aleatórios retornam a locais visitados muitas vezes( isso é conhecido como "sobreamostragem"). Uma estratégia para evitar tal problema é, de vez em quando, dar um grande passo. Isso permite que o caminhante busque aleatoriamente em volta de um ponto específico, enquanto pulando, periodicamente, muito longe para reduzir a quantidade de sobreamostragem. Esta variação no caminho aleatório (conhecido como Voos de Lévy) requer um conjunto personalizado de probabilidades. Embora não seja uma implementação exata dos Voos de Lévy, podemos afirmar a distribuição das probabilidades da seguinte forma: quanto maior o passo, menor a probabilidade de ser escolhido; quanto menor o passo, mais provável.
Anteriormente nesta seção, vimos que é possível gerar distribuições probabilísticas personalizadas através do preenchimento de um arranjo com valores (alguns repetidos, para que sejam escolhidos com maior frequência) ou testando o resultado de random(). Nós poderíamos implementar os Voos de Lévy dizendo que há uma chance de 1% de o caminhante dar um grande passo.
var r = random(1);
// 1% de chance de dar um grande passo
if (r < 0.01) {
  xstep = random(-100, 100);
  ystep = random(-100, 100);
} else {
  xstep = random(-1, 1);
  ystep = random(-1, 1);
}
No entanto, isso reduz as probabilidades para um número fixo de opções. E se quiséssemos fazer um regra mais geral—quanto maior o número, mais chances ele tem de ser escolhido? 3,145 seria mais provável de ser escolhido do que 3,144, mesmo que essa probabilidade seja um pouco maior. Em outras palavras, se x for o número aleatório, poderíamos mapear a probabilidade no eixo y com y=x.
Imagem da Natureza do Código
Figura 1.4
Se conseguirmos descobrir como gerar uma distribuição de números aleatórios de acordo com o gráfico acima, poderemos aplicar o mesmo método a qualquer curva para a qual tivermos uma fórmula.
Uma solução é escolher dois números aleatórios ao em vez de um. O primeiro número aleatório é apenas isso, um número aleatório. O segundo, entretanto, é o que chamamos de "valor aleatório qualificado. Ele nos dirá quando usar o primeiro ou jogá-lo fora e escolher outro. Números que tiverem uma qualificação mais fácil serão escolhidos com maior frequência e os que raramente se qualificam serão escolhidos com menor frequência. Aqui estão os passos (por hora, vamos considerar apenas valores aleatórios entre 0 e 1):
  1. Escolha um número aleatório: R1
  2. Calcule a probabilidade P que R1 deve qualificar. Vamos tentar: P = R1.
  3. Escolha outro número aleatório: R2
  4. Se R2 for menor que P, então encontramos nosso número—R1!
  5. Se R2 não for menor que P, volte para a etapa 1 e comece novamente.
Aqui dizemos que a frequência de um valor aleatório a ser qualificado é igual ao número aleatório em si. Vamos escolher, por exemplo, 0,1 para R1. Isso significa que R1 terá uma chance de 10% de qualificação. Se escolhermos 0,83 para R1 então terá uma chance de 83% de se qualificar. Quanto maior o número, maior a chance de nós o usarmos.
Aqui está uma função (em homenagem ao Método de Monte Carlo, que por sua vez é uma homenagem ao cassino de Monte Carlo) que implementa o algoritmo acima, retornando um valor aleatório entre 0 e 1. Esse programa usa valores para dimensionar elipses, mas podemos usar esse valores para muitas coisas.

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.