El problema del coleccionista de cromos

propuesto por GregoGC

El problema del coleccionista de cromos. Ejercicio con 4 apartados

Enunciado
El problema del coleccionista de cromos.
a) Define una función inserta que tome como parámetros un valor y una lista ordenada sin elementos repetidos (asume esta precondición), y devuelva la lista ordenada sin elementos repetidos que se obtiene al insertar (si no está ya presente) el valor en la lista argumento. Por ejemplo:
inserta 2 [1,3,10] => [1,2,3,10]
inserta 20 [1,3,10] => [1,3,10,20]
Si el valor ya estaba presente en la lista argumento, se devolverá la misma lista. Por ejemplo:
inserta 3 [1,3,10] => [1,3,10]
b) Supongamos que queremos completar una colección con nc cromos distintos y que la probabilidad de obtener cualquiera de ellos al comprar cromos en un kiosco es la misma. La siguiente función devuelve una lista infinita de cromos aleatoria acorde a estas condiciones:
cromos :: Int -> Semilla -> [Int]
cromos nc s = aleatoriosDe [1..nc] s
de modo que cada cromo distinto queda representado por un número entre 1 y nc. Define una función cuentaCromos, con parámetros nc y s, que determine el número de cromos que es necesario comprar para completar una colección con nc cromos, si realizamos un experimento con semilla s. Para ello, se irán contando todos los cromos que son necesarios tomar de la lista devuelta por cromos nc s hasta completar la colección. Puedes representar la colección con un parámetro acumulador (inicialmente la lista vacía), al que deberás añadir (usando la función inserta) cromos de la lista aleatoria hasta que la colección esté completa (hasta que el acumulador coincida con la lista [1..nc]).
c) Define una función promedioCromos que calcule el número esperado de cromos necesarios para completar una colección con nc cromos. Para ello, la función tomará dos parámetros nc y n, realizará n experimentos (con distintas semillas desde 0 hasta n-1) para el problema del coleccionista con nc cromos, calculará el número de cromos comprados en cada experimento y devolverá el promedio (media aritmética) de dichos valores.
d) Supongamos que para el último cromo de la colección el fabricante hace una décima parte de copias con respecto a los demás cromos. Esto puede ser modelado con la siguiente función para generar cromos bajo estas nuevas condiciones:
cromos' :: Int -> Semilla -> [Int]
cromos' nc s = aleatoriosDe cs s
where cs = nc : concat [ replicate 10 c | c <- [1..nc-1]]
Donde la función predefinida replicate n x devuelve una lista con n repeticiones del valor x.
Determina realizando 1000 experimentos el número de cromos necesarios para completar una colección de 20 cromos usando estas condiciones y compáralo con el caso en el cual hay igual número de copias para cada cromo.

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

0 Soluciones

Aún nadie ha dado solución a este desafío, se el primero y acepta el desafío.

Dar mi solución