O problema é que o governo quer fechar a roleta eletrônica e afirma que a roleta falhou no teste estatístico.
Desculpe pelo meu idioma, mas isso é traduzido da lei eslovena da melhor maneira possível. Os requisitos oficiais (por lei) são:
- A frequência de cada evento não deve diferir da frequência esperada em mais de 3 sigma
- O teste do qui quadrado da distribuição normal deve estar dentro do nível de risco de 0,025
- teste de correlação consecutiva tem que passar no teste de 3 sigma e no teste do qui quadrado
Testei os 2 primeiros requisitos e eles passaram nos testes, mas tenho problemas para entender o 3º requisito. (lembre-se de que isso é traduzido e "correlação consecutiva" pode ser outra coisa)
Como devo testar o 3º requisito?
Dados se alguém estiver interessado:
http://pastebin.com/ffbSKpr1
EDIT: chi ao quadrado falha 2% do tempo (o que eu espero que seja esperado devido ao fato de que alfa é 0,025) e o teste sigma3 falha 5%, onde eu espero 9% de falha no 3sigma (parece que as frequências não são distribuídas de acordo com distribuição normal, mesmo para números aleatórios)
Talvez eu não entenda essa lei corretamente, mas é quase 0% de probabilidade de passar no teste 3sigma para todos os vetores de autocorrelação, uma vez que é 9% de probabilidade de falha na execução única e 2,5 no teste do qui-quadrado.
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 )