>________________________________
> 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

Responder a