jueves, 19 de abril de 2012

Pruebas estadísticas para los números pseudoaleatorios

La aleatoriedad, la vemos día con día o estan presentes con nosotros. Diciendo algunos casos o ejemplos podría ser: en la criptografía, creación de fractales en videojuegos, que este a su vez podría ser paisajes, muestras experiementales de poblaciones, como la simulación de un virus, entre otros.

Para esta entrada, se nos encargo crear números aleatorios y hacer pruebas estadísticas.

En mi caso para crear los números aleatorios utilize php, ya que la mayoría de mis companeros utilizaron python, aparte que me daba interes de subirla a la web, para que otros probaran de ella. en la creación de números aleatorios me base en la distribución normal.


Para no meter rollo de definición de la distribución de gauss, les dejo el link a wikipedia.

";

function gauss_base($m = 0.0, $s = 1.0){//media = 0 y su desv. estandar es 1.0                                                                                          
  $a = gauss()*$s + $m;
  return $a;
}

function gauss()
{
  //variables auxiliares                                                                                                                                                
  $x = (float)rand()/(float)getrandmax();
  $y = (float)rand()/(float)getrandmax();

  // Ecuaciones para la dist. normal                                                                                                                                    
  $a1 = sqrt(-2*log($x))*cos(2*pi()*$y);
  return $a;
}

for($i = 0 ; $i < 10 ; $i++){
  echo gauss_base()."
";
}


Los resultados los pueden ver en la siguiente página: http://abimage.comli.com/simulado/randnormal.php la página se ve un poco fea, pero mas adelante le agregare opción para que le indiques la cantidad de números a crear.

Para las pruebas de aleatoriedad me base en el código que habia implementado Cecilia en python, ya que tenia una librería que me facilita y ayuda mucho, la cual es scipy, donde me apoyaria con la prueba de anderson:

";
import math
from scipy import stats

ar = open("prueba.dat", "r")

datos = []

for l in ar:
    datos = l.split(", ")

print datos
a = [float(i) for i in datos]

a = [float(i) for i in x]

anderson, critical, sig = stats.anderson(a, dist='norm')
print anderson
print critical
print sig

for i in range(len(critical)):
    if anderson > critical[i]:
        print "La prueba se rechazada con valor de significancia " + str(sig[i])
    else:
        print "La prueba no es rechazada con valor de significancia " + str(sig[i])

ar.close()



Lo que hace el código es leer un archivo, los cuales toma de un archivo, lo parametros los paso de script de php y este lo agrega a un array, para despues analizar si los valores son mayores a los críticos y esta decir si es rechazada o aceptada. Hay que tomar en cuenta que la distribucion a emplear será normal, ya que estoy empleando la función gaussiana.

captura:


En las pruebas utilice monobit y  bloques (tambien un intento fallido de Wald–Wolfowitz runs test).

En los test, me base de unos scripts que entontre en la web, mas abajo pongo los links.

los resultados dados son los siguientes, donde vemos que los valores pasaron las pruebas:


Los valores cambiaron un poco, ya que le metí mas números aleatorios.

Wald–Wolfowitz
Esta es una prueba de secuencias de aleatoriedad, se utiliza para probar la hipótesis de que una serie de números. La prueba es un conjunto de valores secuenciales que van todos por encima o por debajo de la media.  Para hacer la prueba, el número total de secuencias se toman junto con el número de valores positivos y negativos, para despues sustituirse en su ecuación.
Z = (R – E(R)) / sqrt(V(R))

donde R es la muestra

E(R) = ( 2nm / (n + m) ) + 1
V(R) = ( 2nm(2nm – n – m )) / ((n + m)2 (n + m – 1))

n, la cantidad de números positivos
m, la cantidad de números negativos

Bibliografía:
http://www.random.org/analysis/
http://www.phy.duke.edu/~rgb/General/dieharder.php
http://stackoverflow.com/questions/2145510/python-random-is-barely-random-at-all
http://pypi.python.org/pypi/skidmarks/
http://pastebin.com/GgV90cSW
http://support.sas.com/kb/33/092.html

1 comentario: