Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Programa para simular o Paradoxo do aniversário

Em teoria das probabilidades, o paradoxo do aniversário afirma que dado um grupo de 23 (ou mais) pessoas escolhidas aleatoriamente, a chance de que duas pessoas terão a mesma data de aniversário é de mais de 50%. Para 57 ou mais pessoas, a probabilidade é maior do que 99%, entretanto, ela não pode ser exatamente 100% exceto que se tenha pelo menos 367 pessoas.

Escreva um programa que recebe um número n de pessoas e um número x de repetições e sorteia listas com datas de aniversário, e verifica se existe alguma data coincidente. Para cada loop deve-se re-sortear as listas, e para cada lista onde há casos coincidentes deve-se acrescentar 1 ao número de casos favoráveis. Depois de rodados os x loops de a porcentegem de vezes em que houve aniversários coincidentes.

Detalhe: Use compressão de listas para gerar as datas de aniversário

Tentativa de solução:

import random

datas =[x for x in range(1,366)]
#print(datas)


n = int(input("Digite o número de pessoas: "))
x = int(input("Digite o número de repetições: "))
datas_sorteadas = []
favoraveis = 0
for i in range(x):
    for i in range(n):
        datas_sorteadas.append(random.choice(datas))
        print(datas_sorteadas)

    for data in datas_sorteadas:
        if datas_sorteadas.count(data)>=2:
            favoraveis +=1
    datas_sorteadas = []
    datas_sorteadas.append(random.choice(datas))
    print(datas_sorteadas)

print("Casos Favoráveis: ", favoraveis)

print("n*x",n*x)
print("Percentual: ", (favoraveis/(n*x)))
#print(datas_sorteadas)

O programa está rodando sem erros mas desconfio que não está correto. Os resultados não condizem com a teoria. Alguma ideia de como corrigir?

6 respostas

Oi Edson,

A simulação faz sentido, mas você está contando os casos favoráveis errado.

Um caso é favorável se houve pelo menos uma colisão. O que você está contando é a soma do número de colisões por caso.

No seu programa, o número total de casos é x. Você precisa arrumar a contagem de casos favoráveis e a razão que você procura é favoraveis / x.

@Gabriel de Russo e Carmo: Obrigado!

Como implementar o "se houve pelo menos uma colisão" ? Alguma sugestão?

Você pode usar uma flag para verificar se ocorreu uma colisão. Se sim, você conta.

colisao = False
for data in datas_sorteadas:
    if datas_sorteadas.count(data)>=2:
        colisao = True

if colisao:
    favoraveis += 1

@Gabriel de Russo e Carmo:

Suponha que datas_sorteadas = [1,1,1,30,30]

Neste caso, favoraveis não deveria ser 2? Pelo algoritmo acima, daria 1.

Estou tirando esta dúvida para aprender! Agradeço a atenção!

solução!

Não. Veja o enunciado

Para cada loop deve-se re-sortear as listas, e para cada lista onde há casos coincidentes deve-se acrescentar 1 ao número de casos favoráveis.

Um caso favorável é uma lista em que há confronto. Não o número de confrontos de uma lista.

@Gabriel de Russo e Carmo: obrigado pela paciência! Agora entendi!