>________________________________
> From: JJ Merelo <[email protected]>
>To: Lista de correo de Madrid Perl Mongers <[email protected]>
>Sent: Tuesday, March 5, 2013 6:25 PM
>Subject: [Madrid-pm] Manejando tests que pueden fallar de vez en cuando
>
>
>Hola,
>Como siempre, estoy con el mastermind. Tengo un operador que "baraja" con
>shuffle una cadena, pero que como es natural cuando la cadena es pequeña tiene
>una probabilidad no nula de dar el mismo resultado. ¿Hay algún módulo de test
>que permita fallar un test de vez en cuando? O lo meto en un bloque skip, lo
>que en realidad invalidaría todo el test...
>
>Lo único que se me ocurre es hacer los tests y pasar si son diferentes en un
>porcentaje determinado de los casos, 95%, por ejemplo...
Bueno, este es un problema de estadistica clasico. No puedes nunca decir al
100% si tu programa funciona o no, pero si puedes fijar el porcentaje de falsos
positivos que estas dispuesto a aceptar, buscar unas variables aleatorias que
sean faciles de calcular y en funcion del numero de repeticiones del
experimento, ver los intervalos de confianza en los que se tienen que mover.
Por ejemplo, en tu caso, el experimento es barajar n elementos y lo repites o
veces. Si asignas a cada elemento su ordinal, puedes calcular para cada
posicion de la baraja el valor medio despues de barajarla.
Por ejemplo, en el caso de n=2 elementos (0 y 1) si repites el experimento o=4
veces y obtienes el siguiente resultado:
0 1
0 1
1 0
0 1
Los valores medios para el primer y segundo elemento de la baraja barajada son
x0=1/4 y x1=3/4 respectivamente.
La probabilidad de que 1/4 <= x <= 3/4 es 1 - 2 * (2 ** -o) = 7/8 si todas las
posible ordenaciones son equiprobable (*). Osea que si elijes como valido el
intervalo [1/4, 3/4], y resulta que x0 o x1 no esta en ese intervalo y dices
que el algoritmo falla, la probabilidad de que te hayas equivocado y de que si
este funcionando bien es 1/8.
Pero bueno, esto es la teoria, en la practica, si no te va la vida en ello,
puedes hacerlo mucho más simple ajustando los intervalos de confianza a ojo. Si
tu algoritmo de "barajeo" es rapido, podras correr los tests con valores altos
de o, con lo que los valores de x convergeran rapidamente a n/2. Usa un
algoritmo que sepas que funciona bien para ver donde se tienen que mover los
valores de o en funcion de q, añade un margen de confianza y a correr!
O si lo quieres hacerlo con un poco más de rigor, para valores de q grandes,
puedes aproximar la distribucion de las medias a una normal.
(*) p(1/4 <= x <= 3/4) = 1 - la probabilidad de todos los valores en esa
columna sean a la vez 0 o 1
>
>
>--
>JJ
>_______________________________________________
>Madrid-pm mailing list
>[email protected]
>http://mail.pm.org/mailman/listinfo/madrid-pm
>
>
_______________________________________________
Madrid-pm mailing list
[email protected]
http://mail.pm.org/mailman/listinfo/madrid-pm