Probabilidade
Simulação
Otimização de código por concorrência
27/03/2022
Probabilidade
Simulação
Otimização de código por concorrência
Essa coleção possui 20 tazos(Champions league de 2000 até 2019).
Assumi que a probabilidade de tirar um tazo é o mesma para todos os tazos.
Quanto dinheiro preciso gastar até completar a coleção?
Se não for possível responder exatamente a pergunta acima, o que podemos fazer?
Precisamos pensar de forma probabilística em vez de determinística.
O que é probabilidade?
Evento
Variável Aleatória
Distribuição de uma variável aleatória
Esperança
Seja X o evento: “Face obtida ao rolar um dado não viciado”.
\[ P(X=6) = \frac{1}{6} \]
Seja X o evento: “Face obtida ao rolar um dado não viciado”.
\[ P(X<3) = P(X=1) + P(X=2) = \frac{1}{6} + \frac{1}{6} = \frac{1}{3} \]
X: “Face obtida ao rolar um dado não viciado”
| x | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| p(x) | 1/6 | 1/6 | 1/6 | 1/6 | 1/6 | 1/6 |
Média ponderada onde os pesos são os possíveis valores que a variável aleatória assume.
Para o evento anterior os pesos são 1, 2, 3, 4, 5 e 6.
Logo, \(E[X] = 1\times\frac{1}{6} + 2\times\frac{1}{6} + ... + 6\times\frac{1}{6} = 3.5\)
X: “Número de sacos de batata comprados para completar a coleção, dado que são 20 tazos”
Não é nem um pouco trivial encontrar a distribuição para essa variável aleatória.
O que podemos fazer então?
Repetiremos o experimento múltiplas vezes.
Para cada experimento vamos guardar o resultado final.
Calcularemos a média dos resultados obtidos.
Alguns resultados da inferência estatística sustentam que a média calculada vai se aproximar do valor esperado teórico se o número de repetições for grande o suficiente.
Código fonte: https://gist.github.com/edumangabeira/b7f42b063da9bc55a994f997a007b668
303.0165 milissegundos para executar 100 mil repetições.
Dá conta do trabalho e é mais rápido que o Python puro, por exemplo.
Go é uma linguagem com suporte à concorrência, mas possui ferramentas que permitem paralelismo.
Como a otimização é meramente para os cálculos, é de se imaginar que concorrência seria menos eficaz que um loop.
Porém, a solução por paralelismo também é menos eficiente, provavelmente porque os cálculos são triviais.
Após as simulações é possível ver que E[X] parece estar convergindo para 72.
Com o valor esperado obtido podemos obter um limite superior para a ocorrência de um evento.
Iremos usar um resultado da teoria das probabilidades conhecido como Desigualdade de Markov.
\[ P(X\geq k)\leq \frac{E[X]}{k}, k>0\]
Dado que X: “Número de sacos de batata comprados para completar a coleção, dado que são 20 tazos”
E dado que E[X] = 72
No pior dos casos, qual a probabilidade de que seja preciso comprar 100 ou mais sacos de batatas para completar a coleção?
\[ P(X\geq 100)\leq \frac{72}{100} = 0.72\]
Descobrimos que é possível dizer algo sobre um fenômeno aleatório mesmo desconhecendo a distribuição da variável aleatória correspondente.
No pior dos casos possíveis a probabilidade de se comprar mais do que 100 sacos de bata é \(0.72\).