01.
def
moeda_ao_ar(n):
02.
"""Avalia o número de caras e coroas após n lançamentos de uma moeda. """
03.
conta_caras
=
0
04.
conta_coroas
=
0
05.
for
i
in
range(n):
06.
valor
=
random.randint(
0
,
1
)
07.
if
valor
=
=
0
:
08.
conta_caras
=
conta_caras
+
1
09.
else
:
10.
conta_coroas
=
conta_coroas
+
1
11.
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.
01.
from
operator
import
itemgetter
02.
from
pylab
import
*
03.
import
random
04.
05.
06.
def
moeda(vezes, numero):
07.
# calcula
08.
caras
=
{}
09.
for
i
in
range(vezes):
10.
ca, co
=
moeda_ao_ar(numero)
11.
caras[ca]
=
caras.get(ca,
0
)
+
1
12.
# visualiza
13.
chaves, valores
=
split_dic(caras)
14.
ver(chaves,valores)
15.
16.
def
moeda_ao_ar(n):
17.
"""Avalia o número de caras e coroas após n lançamentos de uma moeda. """
18.
conta_caras
=
0
19.
conta_coroas
=
0
20.
for
i
in
range(n):
21.
valor
=
random.randint(
0
,
1
)
22.
if
valor
=
=
0
:
23.
conta_caras
=
conta_caras
+
1
24.
else
:
25.
conta_coroas
=
conta_coroas
+
1
26.
return
(conta_caras, conta_coroas)
27.
28.
def
split_dic(dicio):
29.
"""
30.
Separa um dicionário numa lista com duas listas: chaves e valores.
31.
A separação é feita de modo a ter as listas ordenadas pelas chaves.
32.
"""
33.
lista
=
dicio.items()
34.
lista.sort(key
=
itemgetter(
0
))
35.
chaves
=
[ chave
for
chave,valor
in
lista]
36.
valores
=
[ valor
for
chave,valor
in
lista]
37.
return
chaves,valores
38.
39.
40.
def
ver(x,y):
41.
"""Faz um plot simples."""
42.
title(
'Distrib. Caras'
)
43.
xlabel(
'Valor'
)
44.
ylabel(
'Freq.'
)
45.
plot(x,y)
46.
show()