El problema es que el gobierno quiere cerrar la ruleta electrónica y afirman que la ruleta falló en la prueba estadística.
Lo siento 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 distribución normal debe estar dentro del nivel de riesgo de 0.025
- La prueba de correlación consecutiva tiene que pasar la prueba 3 sigma y la prueba de chi cuadrado
He probado los primeros 2 requisitos y pasan las pruebas, pero tengo problemas con la comprensión del tercer requisito. (tenga en cuenta que esto se traduce y la "correlación consecutiva" puede ser otra cosa)
¿Cómo debo probar el tercer requisito?
Datos si alguien está interesado:
http://pastebin.com/ffbSKpr1
EDITAR: el chi cuadrado falla el 2% del tiempo (lo que espero que se espere debido al hecho de que alfa es 0.025) y la prueba sigma3 falla el 5% donde espero un 9% de falla para 3sigma (parece que las frecuencias no se distribuyen de acuerdo con distribución normal incluso para números aleatorios)
Es posible que no entienda esta ley correctamente, 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 de chi cuadrado.
Código de 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 )