In [ ]:
%matplotlib inline 

import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import time


def kolmogorov():
    
    #Generador de numeros aleatorios
    
    print('Escoja el generador a probar: ')
    print("Opciones\n1.- RANDU\n2.- Sinclair ZX81\n3.- Numerical Recipes\n4.-Borland C/C++")
    seleccion = raw_input("Opcion: ")
    generadores = { '1': randu, '2': sinclair, '3': numericalRecipes, '4': borland}
    n = raw_input("Inserte la cantidad de numeros a generar n: ")
    x = generadores[seleccion](n)
    # Teoretical CDF for Uniform distribution F(x)
    u = [1.0] * n
    
    # Plot empirical distribution f(x)
    count, bins, ignored = plt.hist(x, 10, normed=True)
    plt.plot(bins, np.ones_like(bins), linewidth=3, color = '#FA58F4')
    plt.show()
    # Generamos la distribucion acumulada de una distribucion uniforme con parametros 0 y 1, para N valores.
    x1 = np.arange(1/(N+0.0),1+1/(N+0.0),1/(N+0.0))
    y1 = np.cumsum(np.sort(u)/np.max(np.cumsum(u)))
    #Generamos distribucion acumulada del generador que estamos evaluando para N valores.
    x2 = np.sort(x)
    y2 = np.cumsum(np.sort(x)/np.max(np.cumsum(x)))

    De=np.absolute(y2-y1)
    print("De = ",np.max(De))
    
    # Plotting
    plt.plot(x1,y1,label='Uniforme')
    plt.step(x2,y2,label='Aleatoria')
    x3 = [x1[De.argmax()],x1[De.argmax()]]
    y3 = [np.min([y1[De.argmax()],y2[De.argmax()]]),np.max([y1[De.argmax()],y2[De.argmax()]])]
    plt.step(x3,y3,label='De')
    
    plt.legend()
    plt.xlabel('X')
    plt.ylabel('Probabilidad acumulada P(X)')
    Da = (1.36/(N**0.5)+0.0)
    if np.max(De)< Da:
        print 'El generador probado es uniforme, hipotesis aceptada, De: ',np.max(De),' es menor que Da: ',Da
    else:
        print 'Hipotesis rechazada, generador no uniforme. Da: ',Da
    print 'Nivel de significacion a: ',(0.05)
        
    
def rachas():
    
    print('Escoja el generador a probar: ')
    print("Opciones\n1.- RANDU\n2.- Sinclair ZX81\n3.- Numerical Recipes\n4.-Borland C/C++")
    seleccion = raw_input("Opcion: ")
    generadores = { '1': randu, '2': sinclair, '3': numericalRecipes, '4': borland}
    n = raw_input("Inserte la cantidad de numeros a generar n: ")
    x = generadores[seleccion](n)
    
    #Test de rachas
    creciente = True
    rachasCrecientes = 0
    rachasDecrecientes = 0
    #x = [1,2,5,3,4,6,2,1,10,11,9,8,7,6] Distribucion de prueba
    for i in range(len(x)):
        if(i == 0):
            if(x[i]<x[i+1]):
                creciente = True
                rachasCrecientes += 1
            else:
                creciente = False
                rachasDecrecientes += 1
        else:
            if(creciente == True):
                if(x[i]<x[i-1]):
                    rachasDecrecientes += 1
                    creciente = False
            else:
                if(x[i]>x[i-1]):
                    rachasCrecientes += 1
                    creciente = True
    # R numero de rachas
    R = rachasCrecientes + rachasDecrecientes
    print R
    #Z estadistico de contraste
    Z = (R-(2*N-1)/3)/((16*N-29)/90)**0.5
    print Z
    print'Nivel de confianza a: ',(0.05)
    if(abs(Z) < 0.50978):
        print'El generador probado es aleatorio. Hipotesis aceptada.'
    else:
        print 'El generador probado NO es aleatorio. Hipotesis rechazada'
                    
def chicuadrado():
    
    print('Escoja el generador a probar: ')
    print("Opciones\n1.- RANDU\n2.- Sinclair ZX81\n3.- Numerical Recipes\n4.-Borland C/C++")
    seleccion = raw_input("Opcion: ")
    generadores = { '1': randu, '2': sinclair, '3': numericalRecipes, '4': borland}
    n = raw_input("Inserte la cantidad de numeros a generar n: ")
    x = generadores[seleccion](n)
    k = N/4
    fi, clases, nadaimportante = plt.hist(x, k)
    # fi = observaciones encontradas, ei= observaciones esperadas
    ei = np.ones_like(clases)*(N/k)

    plt.plot(clases, ei, linewidth=3, color = '#FA58F4')
    plt.show()
    #print fi,clases  
    chi2 = 0
    ei = N/k
    for i in fi:
        chi2 += (i-ei)**2
    #print chi2
    if chi2<=124.342:
        print 'Hipotesis aceptada. Generador Uniforme. Estadistico x2: ',chi2
        print 'Nivel de significacion a: ',(0.05)
    else:
        print 'Hipotesis rechazada. Generador NO Uniforme. Estadistico x2: ',chi2

def randu(n):
    xList = [] #arreglo con los numeros generados
    m = 2**31
    lastXn = int(time.clock())+65539
    for i in range(n):
        Xn = float((65539*lastXn)% m)
        lastXn = Xn
        random = float(Xn/m)
        xList.append(random)
        #print random
    #print xList
    return xList

def sinclair(n):
    
    xList = [] #arreglo con los numeros generados
    m = 2**16+1
    lastXn = int(time.clock())+65539
    for i in range(n):
        Xn = float((75*lastXn)% m)
        lastXn = Xn
        random = float(Xn/m)
        xList.append(random)
        #print random
    #print xList
    return xList

def numericalRecipes(n):
    
    xList = [] #arreglo con los numeros generados
    m = 2**32
    lastXn = int(time.clock())+65539
    for i in range(n):
        Xn = float((1664525*lastXn+1013904223)% m)
        lastXn = Xn
        random = float(Xn/m)
        xList.append(random)
        #print random
    #print xList
    return xList

def borland(n):
    
    xList = [] #arreglo con los numeros generados
    m = 2**32
    lastXn = int(time.clock())+65539
    for i in range(n):
        Xn = float((22695477*lastXn+1)% m)
        lastXn = Xn
        random = float(Xn/m)
        xList.append(random)
        #print random
    #print xList
    return xList
    
def main():
    
    print("Opciones\n1.- Test de Kolmogorov-Smirnov\n2.- Test de Rachas\n3.- Test de Chi-cuadrado")
    seleccion = raw_input("Elija una opcion: ")
    tests = { '1': kolmogorov, '2': rachas, '3': chicuadrado}
    tests[seleccion]()

    
main()


Opciones
1.- Test de Kolmogorov-Smirnov
2.- Test de Rachas
3.- Test de Chi-cuadrado

In [ ]:


In [ ]:


In [ ]: