El problema del cumpleaños

propuesto por GregoGC

El problema del cumpleaños. Supón que una serie de personas van entrando en una habitación (inicialmente vacía) una a una, hasta que hay dos personas en la habitación que cumplen años el mismo día. En promedio, ¿cuántas personas deberán entrar en la habitación para que se produzca la coincidencia de cumpleaños?. Escribe un programa para determinar la solución a este problema.

Enunciado
El problema del cumpleaños. Supón que una serie de personas van entrando en una habitación (inicialmente vacía) una a una, hasta que hay dos personas en la habitación que cumplen años el mismo día. En promedio, ¿cuántas personas deberán entrar en la habitación para que se produzca la coincidencia de cumpleaños?. Escribe un programa para determinar la solución a este problema.
Dado que hay 365 días en un año, puedes modelar los distintos cumpleaños como números entre 1 y 365, por lo que puedes obtener una lista aleatoria infinita de personas (realmente una lista con los cumpleaños de dichas personas) usando la siguiente función:
cumpleaños :: Semilla -> [Int]
cumpleaños s = aleatoriosDe [1..365] s
Un experimento consiste en ir sacando números de la lista aleatoria hasta que se produzca
una repetición y contar los números que ha sido necesario sacar. Para controlar las
repeticiones de cumpleaños, puedes usar un parámetro acumulador (inicialmente la lista
vacía), al que añadirás cada número que saques de la lista aleatoria, hasta que haya una
repetición. Para entender como funcionan los aleatorios, realiza el experimento con
distintas semillas, calcula el número de personas necesarias en cada experimento y obtén por último el promedio (media aritmética) de dichos valores. En otra variante del problema del cumpleaños, se trata de averiguar cuál es la probabilidad de que haya al menos dos personas con el mismo cumpleaños en un grupo de p personas. Un experimento consistirá en tomar una lista de p elementos con valores aleatorios entre 1 y 365. Se producirá un éxito si en dicha lista hay al menos dos valores repetidos (dos personas con el mismo cumpleaños). Para este caso se pide implementar la funcion probCumple:
a) Define una función probCumple que tome dos parámetros correspondientes al número
de personas (p) y al número de experimentos a realizar (n) y calcule la probabilidad de
que haya al menos dos personas con el mismo cumpleaños en un grupo de p personas. Realiza n experimentos (con semillas desde 0 a n-1) y divide el número de experimentos que correspondan a un éxito por el número total de experimentos realizados (n), con lo que tendrás la probabilidad buscada. Para contabilizar los éxitos, puede ser útil definir primero una función que compruebe si hay elementos repetidos en una lista. Si p es 0 se devolverá 0.0 .

Para poder hacer el ejercicio hará falta descargarse la librería Aleatorios.hs, que dejo en el enlace de abajo:
https://www.dropbox.com/s/npmr4ufbbdifp5x/Aleatorios.hs?dl=0
y guardarla en una carpeta llamada Mates
Para implementar la librería hará falta copiar 'import Mates.Aleatorios' al principio del programa.

Ver todo el enunciado

Preguntas sobre el desafío

¿Tienes dudas sobre el desafío? plantéala aquí

Plantea tu pregunta

1 Solución

Dar mi solución