Chỉ trả lời câu hỏi đầu tiên của bạn: "Bạn sẽ áp dụng thử nghiệm nào để xác định xem [chuỗi] này có thực sự ngẫu nhiên không?"
Làm thế nào về việc coi nó như một chuỗi thời gian và kiểm tra các mối tương quan tự động? Đây là một số mã R. Đầu tiên một số dữ liệu thử nghiệm (1000 chữ số đầu tiên):
digits_string="1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989"
digits=as.numeric(unlist(strsplit(digits_string,"")))
Kiểm tra số lượng của từng chữ số:
> table(digits)
digits
0 1 2 3 4 5 6 7 8 9
93 116 103 102 93 97 94 95 101 106
Sau đó biến nó thành một chuỗi thời gian và chạy thử nghiệm Box-Pierce:
d=as.ts( digits )
Box.test(d)
cho tôi biết:
X-squared = 1.2449, df = 1, p-value = 0.2645
Thông thường, bạn muốn giá trị p dưới 0,05 cho biết có tương quan tự động.
Chạy acf(d)
để xem các tương quan tự động. Tôi đã không bao gồm một hình ảnh ở đây vì nó là một biểu đồ buồn tẻ, mặc dù điều tò mò là độ trễ lớn nhất là ở mức 11 và 22. Chạy acf(d,lag.max=40)
để cho thấy rằng không có đỉnh ở độ trễ = 33, và đó chỉ là sự trùng hợp!
PS Chúng ta có thể so sánh 1000 chữ số pi đó đã làm tốt như thế nào, bằng cách thực hiện các bài kiểm tra tương tự trên các số ngẫu nhiên thực.
probs=sapply(1:100,function(n){
digits=floor(runif(1000)*10)
bt=Box.test(ts(digits))
bt$p.value
})
Điều này tạo ra 1000 chữ số ngẫu nhiên, thực hiện kiểm tra và lặp lại 100 lần này.
> summary(probs)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.006725 0.226800 0.469300 0.467100 0.709900 0.969900
> sd(probs)
[1] 0.2904346
Vì vậy, kết quả của chúng tôi là thoải mái trong độ lệch chuẩn đầu tiên, và quẻ như một con vịt ngẫu nhiên. (Tôi đã sử dụng set.seed(1)
nếu bạn muốn sao chép những con số chính xác đó.)