Làm thế nào tôi có thể kiểm tra sự công bằng của một d20?


29

Làm thế nào tôi có thể kiểm tra sự công bằng của một cái chết hai mươi mặt (d20)? Rõ ràng tôi sẽ so sánh phân phối giá trị với phân phối thống nhất. Tôi mơ hồ nhớ sử dụng một bài kiểm tra Chi-vuông ở trường đại học. Làm thế nào tôi có thể áp dụng điều này để xem nếu một cái chết là công bằng?


Tôi đã nghĩ về một thử nghiệm cho một d6 (chết sáu mặt). Điều này bao gồm việc tìm số lượng cuộn cần thiết để kiểm tra. Nó rất cơ bản nhưng tuy nhiên phải mất nhiều thời gian để tính toán. Hãy xem localtrainbeplac.bplaces.net/die.php .

Câu trả lời:


15

Đây là một ví dụ với mã R. Đầu ra được đi trước bởi # 's. Một cái chết công bằng:

rolls <- sample(1:20, 200, replace = T)
table(rolls)
#rolls
# 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
# 7  8 11  9 12 14  9 14 11  7 11 10 13  8  8  5 13  9 10 11 
 chisq.test(table(rolls), p = rep(0.05, 20))

#         Chi-squared test for given probabilities
#
# data:  table(rolls) 
# X-squared = 11.6, df = 19, p-value = 0.902

Một cái chết thiên vị - mỗi số từ 1 đến 10 có xác suất 0,045; 11-20 có xác suất 0,055 - 200 lần ném:

rolls <- sample(1:20, 200, replace = T, prob=cbind(rep(0.045,10), rep(0.055,10)))
table(rolls)
#rolls
# 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
# 8  9  7 12  9  7 14  5 10 12 11 13 14 16  6 10 10  7  9 11 
chisq.test(table(rolls), p = rep(0.05, 20))

#        Chi-squared test for given probabilities
#
# data:  table(rolls) 
# X-squared = 16.2, df = 19, p-value = 0.6439

Chúng tôi không có đủ bằng chứng về sự thiên vị (p = 0,64).

Một cái chết thiên vị, 1000 lần ném:

rolls <- sample(1:20, 1000, replace = T, prob=cbind(rep(0.045,10), rep(0.055,10)))
table(rolls)
#rolls
# 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
# 42 47 34 42 47 45 48 43 42 45 52 50 57 57 60 68 49 67 42 63 
chisq.test(table(rolls), p = rep(0.05, 20))

#        Chi-squared test for given probabilities
#
# data:  table(rolls) 
# X-squared = 32.36, df = 19, p-value = 0.02846

Bây giờ p <0,05 và chúng tôi đang bắt đầu thấy bằng chứng về sự thiên vị. Bạn có thể sử dụng các mô phỏng tương tự để ước tính mức độ sai lệch mà bạn có thể mong đợi để phát hiện và số lần ném cần thiết để phát hiện nó với mức p nhất định.

Wow, 2 câu trả lời khác ngay cả trước khi tôi gõ xong.


Tất cả các câu trả lời là tương tự, nhưng hơi khác nhau. Tôi không nghĩ nó thực sự quan trọng.
csgillespie

Cảm ơn câu trả lời. Tôi chấp nhận điều này bởi vì nó bao gồm tất cả những thứ người mới về giá trị p và từ chối.
C. Ross

10

Bạn có muốn làm nó bằng tay, hoặc trong excel?

Nếu bạn muốn làm điều đó trong R , bạn có thể làm theo cách này:

Bước 1: lăn súc sắc của bạn (giả sử) 100 lần.

Bước 2: đếm số lần bạn nhận được mỗi số của mình

Bước 3: đặt chúng vào R như thế này (viết số lần mỗi lần lăn bạn nhận được, thay vì số tôi đã viết):

x <- as.table(c(1,2,3,4,5,6,7,80,9,10,11,12,13,14,15,16,17,18,19,20))

Bước 4: chỉ cần chạy lệnh này:

chisq.test(x)

Nếu giá trị P thấp (ví dụ: dưới 0,05) - thì điểm chết của bạn không cân bằng.

Lệnh này mô phỏng một khuôn cân bằng (P = ~ .5):

chisq.test(table(sample(1:20, 100, T)))

Và điều này mô phỏng một cái chết không cân bằng:

chisq.test(table(c(rep(20,10),sample(1:20, 100, T))))

(Nó nhận được khoảng P = ~ .005)

Bây giờ câu hỏi thực sự là có bao nhiêu cái chết nên được lăn đến mức độ sức mạnh phát hiện nào. Nếu ai đó muốn giải quyết điều đó, anh ta được hoan nghênh ...

Cập nhật: Cũng có một bài viết hay về chủ đề này ở đây .


5
+1 để tham khảo: đó là một chuyên luận dài về thử nghiệm chết thực tế. Một nửa tác giả đề nghị sử dụng một bài kiểm tra KS và sau đó đi vào các cách để xác định các hình thức sai lệch cụ thể từ sự công bằng. Anh ta cũng nhận thức được rằng chi bình phương là một xấp xỉ cho số lượng nhỏ các cuộn trên mỗi mặt (ví dụ: đối với 100 cuộn của một khuôn 20 mặt), sức mạnh đó thay đổi, v.v., v.v. Nói tóm lại, bất cứ điều gì OP có thể muốn biết rõ là đặt ra.
whuber

8

Không ai đã đề xuất một cách tiếp cận Bayes chưa? Tôi biết câu hỏi đã được trả lời rồi, nhưng cái quái gì thế. Dưới đây chỉ dành cho một cái chết 3 mặt, nhưng tôi đoán rõ ràng là cách khắc phục nó cho mặt.n=37

Đầu tiên, phù hợp với những gì @Glen_b đã nói, một người Bayes không thực sự quan tâm đến việc liệu cái chết có chính xác hay không - điều đó không đúng. Những gì anh ấy quan tâm là liệu nó có đủ gần hay không , dù "đủ" có nghĩa là gì trong bối cảnh, giả sử, trong vòng 5% công bằng cho mỗi bên.

Nếu , và tương ứng với các xác suất của lần lượt 1, 2 và 3, thì chúng tôi trình bày kiến ​​thức trước về với phân phối trước và để làm cho phép toán dễ dàng, chúng tôi có thể chọn một phân phối Dirichlet . Lưu ý rằng . Đối với thông tin không có thông tin trước, chúng tôi có thể chọn các tham số trước đó, giả sử, .p 2 p 3p1p2p3p=(p1,p2,p3)p1+p2+p3=1α0=(1,1,1)

Nếu đại diện cho số lượng quan sát là 1,2,3 thì tất nhiên có phân phối đa thức với các tham số và lý thuyết nói rằng hậu thế cũng là một Phân phối Dirichlet với các tham số . (Dirichlet được gọi là liên hợp trước , ở đây.)X p = ( p 1 , p 2 , p 3 ) α = ( x 1 + 1 , x 2 + 1 , x 3 + 1 )X=(X1,X2,X3)Xp=(p1,p2,p3)α=(x1+1,x2+1,x3+1)

Chúng tôi quan sát dữ liệu, tìm ra hậu thế với quy tắc của Bayes, sau đó TẤT CẢ suy luận dựa trên hậu thế. Bạn muốn một ước tính cho ? Tìm giá trị trung bình của hậu thế. Muốn khoảng tin cậy (không, khoảng đáng tin cậy )? Tính toán một số khu vực dưới sau. Đối với các vấn đề phức tạp trong thế giới thực, chúng ta thường mô phỏng từ phía sau và lấy các ước tính mô phỏng cho tất cả các điều trên.p

Dù sao, đây là cách (với R):

Đầu tiên, lấy một số dữ liệu. Chúng tôi lăn chết 500 lần.

set.seed(1)
y <- rmultinom(1, size = 500, prob = c(1,1,1))

(chúng ta đang bắt đầu với một cái chết công bằng; trong thực tế, những dữ liệu này sẽ được quan sát.)

Tiếp theo, chúng tôi mô phỏng 5000 quan sát từ phía sau và xem kết quả.p

library(MCMCpack)
A <- MCmultinomdirichlet(y, alpha0 = c(1,1,1), mc = 5000)
plot(A)
summary(A)

Cuối cùng, hãy ước tính xác suất sau của chúng tôi (sau khi quan sát dữ liệu) rằng súc sắc nằm trong 0,05 công bằng trong mỗi tọa độ.

B <- as.matrix(A)
f <- function(x) all((x > 0.28)*(x < 0.38))
mean(apply(B, MARGIN = 1, FUN = f))

Kết quả là khoảng 0,9486 trên máy của tôi. (Không có gì đáng ngạc nhiên, thực sự. Chúng tôi đã bắt đầu với một cái chết công bằng sau tất cả.)

Nhận xét nhanh: có lẽ không hợp lý khi chúng tôi đã sử dụng một thông tin không có thông tin trước trong ví dụ này. Vì thậm chí có một câu hỏi có lẽ là cái chết có vẻ gần như cân bằng ở vị trí đầu tiên, vì vậy có thể tốt hơn để chọn một ưu tiên tập trung gần hơn 1/3 trong tất cả các tọa độ. Ở trên điều này chỉ đơn giản là sẽ làm cho xác suất sau ước tính của chúng tôi là "gần với công bằng" thậm chí cao hơn.


8

Một ưu điểm chi bình phương của kiểm tra sự phù hợp nhằm tìm ra tất cả các loại sai lệch có thể có từ tính đồng nhất nghiêm ngặt. Điều này là hợp lý với d4 hoặc d6, nhưng với d20, có lẽ bạn sẽ quan tâm hơn đến việc kiểm tra xem xác suất mà bạn lăn theo (hoặc có thể vượt quá) mỗi kết quả có gần với kết quả không.

Những gì tôi nhận được là có một số loại sai lệch so với sự công bằng sẽ ảnh hưởng lớn đến bất cứ điều gì bạn đang sử dụng d20 và các loại sai lệch khác hầu như không quan trọng, và thử nghiệm bình phương sẽ phân chia sức mạnh giữa thú vị hơn và các lựa chọn thay thế ít thú vị hơn. Hậu quả là để có đủ sức mạnh để nhận được những sai lệch khá vừa phải so với sự công bằng, bạn cần một số lượng lớn các cuộn - nhiều hơn nhiều so với bạn muốn ngồi và tạo ra.

(Gợi ý: đưa ra một vài bộ xác suất không đồng nhất cho d20 của bạn, điều này sẽ ảnh hưởng lớn nhất đến kết quả mà bạn đang sử dụng d20 cho và sử dụng các bài kiểm tra mô phỏng và bình phương để tìm ra sức mạnh mà bạn có để chống lại chúng số lượng cuộn khác nhau, vì vậy bạn có một số ý tưởng về số lượng cuộn bạn sẽ cần.)

Có nhiều cách kiểm tra độ lệch "thú vị" (những cách sẽ có khả năng ảnh hưởng đáng kể đến việc sử dụng điển hình của d20)

Đề nghị của tôi là thực hiện kiểm tra ECDF (kiểm tra loại Kolmogorov-Smirnov / Anderson-Darling - nhưng có lẽ bạn sẽ muốn điều chỉnh mức độ bảo thủ do phân phối bị rời rạc - ít nhất là bằng cách nâng mức alpha danh nghĩa, nhưng thậm chí tốt hơn bằng cách chỉ mô phỏng phân phối để xem cách phân phối thống kê kiểm tra diễn ra trong d20).

Chúng vẫn có thể nhận bất kỳ loại sai lệch nào, nhưng chúng đặt trọng lượng tương đối nhiều hơn vào các loại sai lệch quan trọng hơn.

Một cách tiếp cận thậm chí còn mạnh mẽ hơn là xây dựng một thống kê kiểm tra đặc biệt nhạy cảm với các lựa chọn thay thế quan trọng nhất đối với bạn, nhưng nó liên quan đến công việc nhiều hơn một chút.


Trong câu trả lời này, tôi đề xuất một phương pháp đồ họa để kiểm tra khuôn dựa trên kích thước của các độ lệch riêng lẻ. Giống như thử nghiệm chi bình phương, điều này có ý nghĩa hơn đối với xúc xắc với một vài mặt như d4 hoặc d6.


7

Nếu bạn quan tâm đến việc chỉ kiểm tra số lần mỗi số xuất hiện, thì kiểm tra Chi bình phương sẽ phù hợp. Giả sử bạn lăn một lần chết N lần. Bạn sẽ mong đợi mỗi giá trị sẽ tăng lên N / 20 lần. Tất cả các bài kiểm tra chi bình phương là so sánh những gì bạn quan sát được với những gì bạn nhận được. Nếu sự khác biệt này quá lớn, thì điều này sẽ chỉ ra một vấn đề.

Các xét nghiệm khác

Ví dụ, nếu bạn quan tâm đến các khía cạnh khác của randonness, nếu bạn xúc xắc đưa ra kết quả sau:

1, 2, 3, 4...., 20,1,2,..

Sau đó, mặc dù đầu ra này có số chính xác của từng giá trị riêng lẻ, nhưng rõ ràng nó không phải là ngẫu nhiên. Trong trường hợp này, hãy xem câu hỏi này . Điều này có lẽ chỉ có ý nghĩa cho xúc xắc điện tử.

Kiểm tra chi bình phương trong R

Trong R, điều này sẽ là

##Roll 200 times
> rolls = sample(1:20, 200, replace=TRUE)
> chisq.test(table(rolls), p = rep(0.05, 20))
    Chi-squared test for given probabilities
data:  table(rolls) 
X-squared = 16.2, df = 19, p-value = 0.6439

## Too many 1's in the sample
> badrolls = cbind(rolls, rep(1, 10))   
> chisq.test(table(badrolls), p = rep(0.05, 20))

    Chi-squared test for given probabilities

data:  table(badrolls) 
X-squared = 1848.1, df = 19, p-value < 2.2e-16

0

Có lẽ người ta không nên tập trung nhiều vào một bộ cuộn.

Hãy thử lăn 6 mặt 10 lần và lặp lại quá trình 8 lần.

> xy <- rmultinom(10, n = N, prob = rep(1, K)/K)
> xy
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    3    1    0    0    1    1    2    1
[2,]    0    0    1    2    1    1    0    1
[3,]    1    3    6    0    1    3    2    4
[4,]    2    1    0    5    2    0    2    1
[5,]    3    2    0    2    1    3    3    0
[6,]    1    3    3    1    4    2    1    3

Bạn có thể kiểm tra xem tổng của mỗi khoản tiền lặp lại là 10.

> apply(xy, MARGIN = 2, FUN = sum)
[1] 10 10 10 10 10 10 10 10

Đối với mỗi lần lặp lại (cột-khôn ngoan), bạn có thể tính toán mức độ phù hợp bằng cách sử dụng bài kiểm tra Chi ^ 2.

unlist(unname(sapply(apply(xy, MARGIN = 2, FUN = chisq.test), "[", "p.value")))
[1] 0.493373524 0.493373524 0.003491841 0.064663031 0.493373524 0.493373524 0.669182902
[8] 0.235944538

Bạn càng ném nhiều, bạn sẽ càng thấy ít sai lệch. Hãy làm điều này cho một số lượng lớn.

K <- 20
N <- 10000

xy <- rmultinom(100, n = N, prob = rep(1, K)/K)
hist(unlist(unname(sapply(apply(xy, MARGIN = 2, FUN = chisq.test), "[", "p.value"))))

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.