[Madrid-pm] Manejando tests que pueden fallar de vez en cuando

Salvador Fandino sfandino en yahoo.com
Mar Mar 5 11:09:16 PST 2013








>________________________________
> From: JJ Merelo <jjmerelo en gmail.com>
>To: Lista de correo de Madrid Perl Mongers <madrid-pm en pm.org> 
>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
>Madrid-pm en pm.org
>http://mail.pm.org/mailman/listinfo/madrid-pm
>
>


Más información sobre la lista de distribución Madrid-pm