Comprovació de daus trucats V48391


Statement
 

pdf   zip   main.cc

thehtml

Els daus, pel joc, s’han utilitzat des de l’antiguitat i actualment encara s’utilitzen. També fa molt de temps que existeix l’astúcia dels tramposos que trucaven aquests daus.

Un dau trucat està esbiaixat a favor d’algun resultat, de manera que aquest resultat surt més sovint que no pas els altres. També podem dir que està esbiaixat contra un resultat, de manera que aquest surt menys sovint que els altres.

Una forma per detectar si un dau està trucat és mitjançant l’estadística: si un dau és just, les cares haurien d’aparèixer amb una freqüència similar quan es fan moltes tirades.

Un test senzill per detectar si un dau pot estar trucat és comparar les freqüències relatives de cada cara amb la que s’esperaria si el dau fos just. En un dau just de n cares, totes les cares tenen la mateixa probabilitat: 1/n, o el que és el mateix, un percentatge esperat de 100/n %.

La idea seria calcular el percentatge d’aparicions de cada cara i comprovar si alguna s’allunya massa del valor esperat (100/n). Si hi ha una desviació superior a un cert llindar (per exemple, 5%), es podria sospitar que el dau està trucat.

Implementa una funció ITERATIVA que donat un enter positiu n que indica el nombre de cares del dau, una llista d’enters de valors entre 1 i n i un real que correspon al llindar indica si segons aquestes tirades i el llindar, aquest dau està trucat. A més torna una llista amb el freqüència relativa de cada cara del dau.

Interfície

La capçalera de la funció és la següent:

// Pre: n > 0, llindar >= 0, tirades conté valors que pertanyen al 
//   rang [1..n], freqs és buit
// Post: retorna cert si la llista "tirades" indica que el dau està 
//   trucat; false en cas contrari. A més torna a "freqs" "n" reals 
//   que són les freqüències relatives de cada cara del dau segons 
//   la llista "tirades".
bool esta_trucat(int n, double llindar, const list<int> &tirades, 
                 list<double> &freqs)

Exemple

Per exemple,

esta_trucat(4, 10, [1, 4, 4, 2, 3, 2, 4, 3])

que correspon a diverses tirades amb un dau de 4 cares generaria la següent llista de freqüències relatives per cada cara

[12.5, 25, 25, 37.5]

Amb aquesta nova llista i aplicant el test per detectar daus trucats amb un llindar del 10% tornaria cert (el dau està trucat).

 Cara 1: |25 - 12.5| > 10
 Cara 2: |25 - 25|
 Cara 3: |25 - 25| 
 Cara 4: |25 - 37.5| > 10

És a dir, les cares 1 i 4 superen el llindar indicat.

Observació

Les funcions i accions que creïs han de treballar només amb llistes (la classe list de la biblioteca STL) o arrays dinàmics. Has de trobar una solució ITERATIVA i eficient del problema. Si crees funcions/accions auxiliars, afegeix-hi les corresponents Precondició (Pre) i Postcondició (Post). En els bucles inclou l’invariant del bucle i la funció de fita.

IMPORTANT: Només cal enviar el procediment demanat; el programa principal serà ignorat.

Per tal que els jocs de proves siguin més llegibles el quart paràmetre de la funció (en el que es retorna les freqüències relatives de cada cara del dau) no es mostrarà en els jocs de proves. Si s’hagués de mostrar seria en tots els casos una llista buida (com s’indica a la Precondició).

Public test cases
  • Input/Output

    esta_trucat(6, 10, [1, 2, 3, 5, 6, 1, 2, 3, 5, 6]) → true / [20, 20, 20, 0, 20, 20]
    esta_trucat(4, 15, [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 1, 2]) → false / [33.3333, 33.3333, 16.6667, 16.6667]
    esta_trucat(8, 5, []) → true / [0, 0, 0, 0, 0, 0, 0, 0]
    esta_trucat(10, 5, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5]) → false / [15, 15, 15, 15, 15, 5, 5, 5, 5, 5]
    esta_trucat(20, 5, [11, 11, 12, 13, 14, 15, 16, 18, 19, 20, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10]) → true / [19.2308, 7.69231, 7.69231, 3.84615, 3.84615, 3.84615, 3.84615, 3.84615, 3.84615, 3.84615, 7.69231, 3.84615, 3.84615, 3.84615, 3.84615, 3.84615, 0, 3.84615, 3.84615, 3.84615]
  • Information
    Author
    Bernardino Casas
    Language
    Catalan
    Official solutions
    C++
    User solutions
    C++