def gap_test(alfa=0, beta=1):
    gaps = [0] * constante.CANT_EXPERIMENTOS
    i = 0
    gap = 0
    x_n = gcl_uniforme(constante.SEMILLA)

    while (i < constante.CANT_EXPERIMENTOS):
        if ((x_n < alfa) or (x_n >= beta)):
            gap += 1
        else:
            gaps[i] = gap + 1
            i += 1
            gap = 0

        x_n = gcl_uniforme(x_n)

    p = beta - alfa
    gapMax = max(gaps)

    # agrupo en 11 clases (de la 0 a la 10)
    observed = [0] * 11
    for i in range(10):
        observed[i] = gaps.count(i + 1)

    for i in range(10, gapMax + 1):
        observed[10] += gaps.count(i)

    expected = [0] * 11
    for i in range(10):
        expected[i] = p * ((1 - p)**(i)) * constante.CANT_EXPERIMENTOS

    for i in range(10, gapMax + 1):
        expected[10] += p * ((1 - p)**(i - 1)) * constante.CANT_EXPERIMENTOS

    print("observed", observed)
    print("expected", expected)

    Dsquared, p = stats.chisquare(observed, f_exp=expected)

    t = stats.chi2.ppf(q=0.95, df=10)

    print("Aplicamos test chi cuadrado a los resultados de test gap.")
    print("t: " + str(t))
    print("D^2 : " + str(Dsquared))

    if (Dsquared < t):
        print(
            "ACEPTAMOS la hipotesis con un error del 5% para el gap test con intervalo [{0}, {1}]."
            .format(alfa, beta))
    else:
        print(
            "RECHAZAMOS la hipotesis con un error del 5% para el gap test con intervalo [{0}, {1}]."
            .format(alfa, beta))
def experimento_geometrica(p):
    # genero numero aleatorios uniformes
    x_n = constante.SEMILLA
    empiricos = []

    # hago el experimento
    for _ in range(constante.CANT_EXPERIMENTOS):
        salio1 = False
        lanzamientos = 0
        
        while not salio1:
            x_n = gcl_uniforme(x_n)
            lanzamientos = lanzamientos + 1

            if (x_n >= 1-p) and (x_n < 1):
                salio1 = True
                empiricos.append(lanzamientos)

    return empiricos
def gap_test(alfa, beta):
    x_n = constante.SEMILLA

    gaps = []  # array de nro generado
    gap = 0
    i = 0

    while i < constante.CANT_EXPERIMENTOS:
        x_n = gcl_uniforme(x_n)

        if ((x_n<alfa) or (x_n>=beta)):
            gap = gap + 1
        else:
            gaps.append(gap)
            gap = 0
            i = i + 1

    maxGap = max(gaps)
    counters = {}

    for unGap in gaps:
        if str(unGap) in counters:
            counters[str(unGap)] = counters[str(unGap)]
        else:
            counters[str(unGap)] = 0

    # creo array del contenido como tantos gaps existan
    contadorGaps = [0] * (maxGap)
    for key, value in counters.iteritems():
        print(key)
        contadorGaps[int(key)] = value

    print("contadorGaps", contadorGaps, len(contadorGaps))

    # creo array para valores esperados
    valoresEsperados = [0] * (maxGap)
    for i in range(maxGap):
        valoresEsperados[i] = obtenerProbabilidadDeGap(alfa, beta, i) * constante.CANT_EXPERIMENTOS

    print("valoresEsperados", valoresEsperados, len(valoresEsperados))

    Dsquared = 0

    for key, value in enumerate(contadorGaps):
        Ei = valoresEsperados[key]
        Oi = value

        Dsquared += calcularEst(Oi, Ei)

    t = stats.chi2.ppf(q=0.95, df=len(valoresEsperados) - 1)

    print ("Aplicamos test chi cuadrado a los resultados de test gap.")
    print ("t: " + str(t))
    print ("D^2 : " + str(Dsquared))

    if (Dsquared < t):
        print("ACEPTAMOS la hipotesis con un error del 5% para el gap test con intervalo [{0}, {1}].".format(
            alfa, beta))
    else:
        print("RECHAZAMOS la hipotesis con un error del 5% para el gap test con intervalo [{0}, {1}].".format(
            alfa, beta))
def generar_histograma(numeros_aleatorios):
    plt.hist(numeros_aleatorios)
    plt.title("Histograma GCL")
    plt.xlabel("Valor")
    plt.ylabel("Frecuencia")

    fig = plt.gcf()
    plotly_fig = tls.mpl_to_plotly( fig )
    py.plot(plotly_fig, filename='histograma-gcl')

## resolucion de histograma
x_n = constante.SEMILLA
numeros_aleatorios = []

for _ in range(constante.CANT_EXPERIMENTOS):
    x_n = gcl_uniforme(x_n)
    numeros_aleatorios.append(x_n)

generar_histograma(numeros_aleatorios)
# RESPUESTA 2
import numpy as np
from scipy import stats
from math import log

import plotly.plotly as py
import plotly.graph_objs as go

from funciones import gcl_uniforme
import constante

# Paso 1: Generamos muestras de la variable uniforme U