def moeda_ao_ar(n):
"""Avalia o número de caras e coroas após n lançamentos de uma moeda. """
conta_caras = 0
conta_coroas = 0
for i in range(n):
valor = random.randint(0,1)
if valor == 0:
conta_caras = conta_caras + 1
else:
conta_coroas = conta_coroas + 1
return (conta_caras, conta_coroas)
Existe uma coisa que todos sabemos. Se a moeda não estiver enviesada, então podemos contar com 50% de probabilidades para num lançamento sair caras. Mas será mesmo assim? Para o saber façamos uma pequena experiência. Lançamos a moeda ao ar um certo número de vezes e contamos quantas vezes saiu caras. Mas repetimos esta experiência várias vezes e, de cada vez, anotamos o número de caras que saiu.
Com estes valores guardados podemos fazer um gráfico com a frequência dos valores obtidos. Se tudo bater certo com a teoria, esperamos obter uma distribuição em que o valor médio é o número que a teoria nos indica. Assim, se atiramos a moeda ao ar 10 vezes, repetindo a experiência 100 vezes, esperamos ter visto no final de toda a experiência 5 caras a maior parte das vezes. É claro que algumas vezes será menos e noutras mais. Vamos ver.
Caso de 100 experiências com 10 lançamentos em cada uma.

Agora 5000 experiências com 1000 lançamentos em cada uma.
Como se vê claramente, no primeiro caso temos um valor médio de 5 e, no segundo, de 500. Além disso, reparamos na forma da curva da distribuição, a forma de um sino. É isso mesmo, estamos perante uma distribuição normal, ou gaussiana!
Mas como obtivemos as imagens? Com o Python, claro! Para já mostro o código. Nas próximas aulas vão perceber o que ele significa e como podem começar a resolver questões semelhantes.
from operator import itemgetter
from pylab import *
import random
def moeda(vezes, numero):
# calcula
caras = {}
for i in range(vezes):
ca, co = moeda_ao_ar(numero)
caras[ca]= caras.get(ca,0) + 1
# visualiza
chaves, valores = split_dic(caras)
ver(chaves,valores)
def moeda_ao_ar(n):
"""Avalia o número de caras e coroas após n lançamentos de uma moeda. """
conta_caras = 0
conta_coroas = 0
for i in range(n):
valor = random.randint(0,1)
if valor == 0:
conta_caras = conta_caras + 1
else:
conta_coroas = conta_coroas + 1
return (conta_caras, conta_coroas)
def split_dic(dicio):
"""
Separa um dicionário numa lista com duas listas: chaves e valores.
A separação é feita de modo a ter as listas ordenadas pelas chaves.
"""
lista = dicio.items()
lista.sort(key=itemgetter(0))
chaves = [ chave for chave,valor in lista]
valores = [ valor for chave,valor in lista]
return chaves,valores
def ver(x,y):
"""Faz um plot simples."""
title('Distrib. Caras')
xlabel('Valor')
ylabel('Freq.')
plot(x,y)
show()