Vấn đề là chính phủ muốn đóng roulette điện tử và họ cho rằng roulette thất bại trong thử nghiệm thống kê.
Xin lỗi cho ngôn ngữ của tôi nhưng điều này được dịch từ luật tiếng Slovenia càng tốt càng tốt các yêu cầu chính thức (theo luật) là:
- tần suất của mỗi sự kiện không được khác với tần suất dự kiến quá 3 sigma
- kiểm tra chi bình phương của phân phối bình thường phải nằm trong mức rủi ro 0,025
- kiểm tra tương quan liên tiếp phải vượt qua 3 bài kiểm tra sigma và kiểm tra bình phương
Tôi đã thử nghiệm 2 yêu cầu đầu tiên và chúng vượt qua các thử nghiệm, nhưng tôi gặp vấn đề với việc hiểu yêu cầu thứ 3. (hãy nhớ rằng điều này được dịch và "tương quan liên tiếp" có thể là một cái gì đó khác)
Làm thế nào tôi nên kiểm tra yêu cầu thứ 3?
Dữ liệu nếu ai đó quan tâm:
http://pastebin.com/ffbSKpr1
EDIT: chi bình phương thất bại 2% thời gian (điều tôi mong đợi được dự kiến do thực tế là alpha là 0,025) và thử nghiệm sigma3 thất bại 5% trong đó tôi dự đoán thất bại 9% cho 3sigma (có vẻ như tần số không được phân phối theo phân phối bình thường ngay cả đối với số ngẫu nhiên)
Tôi có thể không hiểu chính xác luật này, nhưng gần như 0% xác suất vượt qua bài kiểm tra 3sigma cho tất cả các vectơ tự tương quan, vì xác suất 9% là thất bại trong một lần chạy và 2,5 cho bài kiểm tra bình phương.
Mã 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 )