El problema es que el gobierno quiere cerrar la ruleta electrónica y afirman que la ruleta no pasó la prueba estadística.
Perdón por mi idioma pero esto está traducido de la ley eslovena lo mejor posible Los requisitos oficiales (por ley) son:
- la frecuencia de cada evento no debe diferir de la frecuencia esperada en más de 3 sigma
- La prueba de chi cuadrado de la distribución normal tiene que estar dentro del nivel de riesgo de 0,025
- la prueba de correlación consecutiva tiene que pasar la prueba de 3 sigmas y la prueba de chi cuadrado
He probado los dos primeros requisitos y pasan las pruebas, pero tengo problemas para entender el tercer requisito. (tenga en cuenta que esto está traducido y "correlación consecutiva" puede ser otra cosa)
¿Cómo debo comprobar el tercer requisito?
Datos si alguien está interesado:
http://pastebin.com/ffbSKpr1
EDITAR: chi cuadrado falla el 2% de las veces (lo que espero que se espera debido al hecho de que el alfa es 0,025) y la prueba de sigma3 falla el 5% donde espero el 9% de fracaso para 3sigma (parece que las frecuencias no se distribuyen de acuerdo a la distribución normal, incluso para los números aleatorios)
Puede que no entienda bien esta ley, pero es casi un 0% de probabilidad de pasar la prueba 3sigma para todos los vectores de autocorrelación, ya que es un 9% de probabilidad de fallar en una sola ejecución y 2,5 para la prueba chi cuadrado.
Código Python:
from math import sqrt
from itertools import *
import random
#uncoment for python 2.x
#zip = izip
#range = xrange
#with open("rng.txt","r") as wr:
# n = [int(i) for i in wr]
n = [random.randint(0,36) for i in range(44000)]
def get_freq(n):
r=[0 for i in range(37)]
for i in n:
r[i] += 1
return r
def trisigmatest(freq):
Ef = 1.0*sum(freq)/37
sigma = sqrt(sum(i**2 for i in freq)/37-Ef**2)
return all((abs(i - Ef )< sigma*3) for i in freq)
def chiquaretest(freq):
Ef = 1.0*sum(freq)/37
chi2 = sum((i-Ef)**2 / Ef for i in freq)
# values are from http://itl.nist.gov/div898/handbook/eda/section3/eda3674.htm
# (EDIT) I recaluclated these valuse from inverse cdf chi2
# distribution for interval (0.025/2,1-0.025/2) (alpha = 0.025)
return 20.4441 < chi2 < 58.8954
#whitout autocorelation
gf = get_freq(n)
if not trisigmatest(gf):
print("failed")
raise
if not chiquaretest(gf):
print("failed")
raise
actests = 1000
trifailed = 0;
chifailed = 0;
for i in range(1,actests + 1):
f=((b-a+37) % 37 for (a,b) in zip(n,n[i:]))
gf = get_freq(f)
if not trisigmatest(gf):
trifailed += 1;
if not chiquaretest(gf):
chifailed += 1;
print("trisigmatest failed ", 1.0 * trifailed / actests )
print("chiquaretest failed ", 1.0 * chifailed / actests )