Jak mogę sprawdzić uczciwość d20?


29

Jak mogę sprawdzić rzetelność dwudziestostronnej kostki (d20)? Oczywiście porównałbym rozkład wartości z rozkładem jednolitym. Niejasno pamiętam test Chi-kwadrat na studiach. Jak mogę to zastosować, aby sprawdzić, czy kość jest sprawiedliwa?


Myślałem o teście na k6 (sześciościenna kostka). Obejmowało to znalezienie liczby rolek niezbędnych do przetestowania. Jest bardzo prosty, ale jego obliczenie zajmuje dużo czasu. Zajrzyj na localtrainbeplac.bplaced.net/die.php .

Odpowiedzi:


15

Oto przykład z kodem R. Dane wyjściowe poprzedzone są znakami #. Sprawiedliwa kostka:

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

Każda tendencyjna kostka - liczby od 1 do 10 mają prawdopodobieństwo 0,045; te 11-20 mają prawdopodobieństwo 0,055 - 200 rzutów:

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

Nie mamy wystarczających dowodów na stronniczość (p = 0,64).

Tendencyjna kostka, 1000 rzutów:

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

Teraz p <0,05 i zaczynamy dostrzegać dowody stronniczości. Możesz użyć podobnych symulacji, aby oszacować poziom odchylenia, którego możesz się spodziewać, i liczbę rzutów potrzebnych do wykrycia go przy danym poziomie p.

Wow, 2 inne odpowiedzi jeszcze zanim skończyłem pisać.


Wszystkie odpowiedzi są podobne, ale nieco inne. Nie sądzę, żeby to naprawdę miało znaczenie.
csgillespie

Dziękuję za odpowiedź. Zaakceptowałem to, ponieważ zawierało ono wszystkie nowicjusze na temat wartości p i odrzucania.
C. Ross

10

Czy chcesz to zrobić ręcznie, czy w programie Excel?

Jeśli chcesz to zrobić w R , możesz to zrobić w ten sposób:

Krok 1: rzuć kostką (powiedzmy) 100 razy.

Krok 2: policz, ile razy dostałeś każdą ze swoich liczb

Krok 3: umieść je w R w ten sposób (napisz ile razy otrzymałeś rzut kości zamiast liczb, które napisałem):

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

Krok 4: po prostu uruchom to polecenie:

chisq.test(x)

Jeśli wartość P jest niska (np. Poniżej 0,05) - twoja kość nie jest zrównoważona.

To polecenie symuluje zbalansowaną matrycę (P = ~ .5):

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

A to symuluje niezrównoważoną kostkę:

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

(To musi być o P = ~ .005)

Teraz prawdziwe pytanie brzmi, ile kości należy rzucić na jaki poziom siły wykrywania. Jeśli ktoś chce rozwiązać ten problem, jest mile widziany ...

Aktualizacja: Jest też ładny artykuł na ten temat tutaj .


5
+1 za odniesienie: jest to długa rozprawa na temat praktycznych testów matryc. W połowie autor sugeruje zastosowanie testu KS, a następnie zastanawia się nad określeniem konkretnych form odstępstwa od uczciwości. Ma również świadomość, że chi-kwadrat jest przybliżeniem małej liczby rzutów na twarz (np. Dla 100 rzutów matrycy 20-stronnej), że moc jest różna itp. Krótko mówiąc, wszystko, co OP może chcieć wiem jest jasno określone.
whuber

8

n=37

Po pierwsze, zgodnie z tym, co powiedział @Glen_b, bayesian nie jest zainteresowany tym, czy kość jest dokładnie sprawiedliwa - nie jest. Dba o to, czy jest wystarczająco blisko , cokolwiek „wystarczające” oznacza w kontekście, powiedzmy, w granicach 5% wartości godziwej dla każdej ze stron.

p1p2)p3)p=(p1,p2),p3))p1+p2)+p3)=1α0=(1,1,1)

X=(X1,X2),X3))Xp=(p1,p2),p3))α=(x1+1,x2)+1,x3)+1)

p

Tak czy inaczej, oto jak (z R):

Najpierw zdobądź trochę danych. Rzucamy kostką 500 razy.

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

(zaczynamy od uczciwej śmierci; w praktyce dane te byłyby obserwowane).

p

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

Na koniec oszacujmy nasze prawdopodobieństwo późniejsze (po obserwacji danych), że matryca mieści się w granicach 0,05 uczciwości w każdej współrzędnej.

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

Wynik to około 0,9486 na moim komputerze. (Naprawdę nie jest to niespodzianka. W końcu zaczęliśmy od uczciwej śmierci).

Szybka uwaga: prawdopodobnie nie jest rozsądne, abyśmy użyli wcześniejszej informacji niż informacyjna w tym przykładzie. Ponieważ istnieje nawet pytanie, prawdopodobnie kostka wydaje się w przybliżeniu wyważona, więc może być lepiej wybrać przeor, który jest skoncentrowany bliżej 1/3 we wszystkich współrzędnych. Powyżej tego po prostu zwiększyłoby nasze szacunkowe prawdopodobieństwo prawdopodobieństwa „bliskiego do sprawiedliwego”.


8

Test dobroci dopasowania chi-kwadrat ma na celu znalezienie wszystkich możliwych odchyleń od ścisłej jednorodności. Jest to uzasadnione w przypadku d4 lub d6, ale w przypadku d20 prawdopodobnie bardziej interesuje Cię sprawdzenie, czy prawdopodobieństwo, że rzucisz (lub prawdopodobnie przekroczysz) każdy wynik, jest bliskie temu, co powinno być.

Chodzi mi o to, że istnieją pewne odchylenia od uczciwości, które będą miały duży wpływ na to, do czego używasz d20, i inne rodzaje odchyleń, które w ogóle nie mają znaczenia, a test chi-kwadrat podzieli moc między bardziej interesujące i mniej interesujące alternatywy. Konsekwencją jest to, że aby mieć wystarczającą moc, aby wychwycić nawet dość umiarkowane odchylenia od uczciwości, potrzebujesz ogromnej liczby rzutów - znacznie więcej niż kiedykolwiek chciałbyś usiąść i wygenerować.

(Wskazówka: wymyśl kilka zestawów niejednolitych prawdopodobieństw dla twojego d20, które będą miały największy wpływ na wynik, dla którego używasz d20, i skorzystaj z symulacji i testów chi-kwadrat, aby dowiedzieć się, jaką moc masz przeciwko nim różne liczby rolek, więc masz pojęcie o liczbie potrzebnych rolek).

Istnieje wiele sposobów sprawdzania „interesujących” odchyleń (takie, które będą bardziej prawdopodobne, że będą miały istotny wpływ na typowe zastosowania d20)

Moje zalecenie to wykonanie testu ECDF (test typu Kołmogorowa-Smirnowa / Andersona-Darlinga - ale prawdopodobnie będziesz chciał skorygować konserwatywność wynikającą z dyskretnego rozkładu - przynajmniej przez podniesienie nominalnego poziomu alfa, ale nawet lepiej po prostu symulując rozkład, aby zobaczyć, jak idzie rozkład statystyki testowej dla d20).

Nadal mogą one wykrywać wszelkie odchylenia, ale kładą stosunkowo większy nacisk na ważniejsze rodzaje odchyleń.

Jeszcze bardziej zaawansowanym podejściem jest zbudowanie statystyki testowej, która jest szczególnie wrażliwa na najważniejsze dla ciebie alternatywy, ale wymaga nieco więcej pracy.


W tej odpowiedzi sugeruję graficzną metodę testowania matrycy na podstawie wielkości poszczególnych odchyleń. Podobnie jak test chi-kwadrat ma to sens w przypadku kości z kilkoma bokami, takimi jak d4 lub d6.


7

Jeśli chcesz sprawdzić, ile razy pojawia się każda liczba, odpowiedni byłby test chi-kwadrat. Załóżmy, że rzucisz kostką N razy. Można oczekiwać, że każda wartość wzrośnie N / 20 razy. Wszystko, co robi test chi-kwadrat, polega na porównaniu tego, co zaobserwowałeś z tym, co dostajesz. Jeśli ta różnica jest zbyt duża, oznacza to problem.

Inne testy

Jeśli interesowały Cię inne aspekty randonness, na przykład, jeśli kostka dała następujący wynik:

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

Następnie, chociaż dane wyjściowe mają poprawną liczbę każdej pojedynczej wartości, wyraźnie nie są losowe. W takim przypadku spójrz na to pytanie . Prawdopodobnie ma to sens tylko w przypadku kości elektronicznych.

Test chi-kwadrat w R.

W R byłoby to

##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

Być może nie należy skupiać się tak bardzo na jednym zestawie rolek.

Spróbuj rzucić kostką 6 boczną 10 razy i powtórz ten proces 8 razy.

> 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

Możesz sprawdzić, czy suma dla każdej powtórzonej sumy wynosi 10.

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

Dla każdego powtórzenia (w kolumnie) można obliczyć stopień dopasowania za pomocą testu 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

Im więcej rzutów wykonasz, tym mniej stronniczy zobaczysz. Zróbmy to dla dużej liczby.

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"))))

wprowadź opis zdjęcia tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.