Le problème est que le gouvernement veut fermer la roulette électronique et ils prétendent que la roulette a échoué au test statistique.
Désolé pour ma langue, mais ceci est traduit de la loi slovène aussi bien que possible. Les exigences officielles (selon la loi) sont:
- la fréquence de chaque événement ne doit pas différer de la fréquence attendue de plus de 3 sigma
- le test du chi carré de la distribution normale doit être dans le niveau de risque de 0,025
- test de corrélation consécutive doit passer le test 3 sigma et le test chi carré
J'ai testé les 2 premières exigences et ils réussissent les tests, mais j'ai des problèmes pour comprendre la 3e exigence. (gardez à l'esprit que cela se traduit et que la "corrélation consécutive" peut être autre chose)
Comment dois-je tester la 3e exigence?
Données si quelqu'un est intéressé:
http://pastebin.com/ffbSKpr1
EDIT: le chi carré échoue 2% du temps (ce que j'attends qui est attendu en raison du fait que alpha est 0,025) et le test sigma3 échoue 5% où j'attends 9% d'échec pour 3sigma (il semble que les fréquences ne soient pas distribuées selon distribution normale même pour des nombres aléatoires)
Je ne comprends peut-être pas correctement cette loi, mais il y a près de 0% de probabilité de réussir le test 3sigma pour tous les vecteurs d'autocorrélation, car il y a 9% de probabilité d'échouer en un seul passage et 2,5 pour le test chi carré.
Code 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 )