Wie kann ich die Fairness eines d20 testen?

29

Wie kann ich die Fairness eines zwanzigseitigen Würfels testen (d20)? Offensichtlich würde ich die Werteverteilung mit einer Gleichverteilung vergleichen. Ich erinnere mich vage an einen Chi-Quadrat-Test im College. Wie kann ich das anwenden, um zu sehen, ob ein Würfel fair ist?

Kreuz
quelle
Ich habe über einen Test für einen d6 (sechsseitiger Würfel) nachgedacht. Dies beinhaltete das Finden der Anzahl der Rollen, die zum Testen notwendig sind. Es ist sehr einfach, dauert aber trotzdem lange zu berechnen. Schauen Sie sich localtrainbeplac.bplaced.net/die.php an .

Antworten:

15

Hier ist ein Beispiel mit R-Code. Der Ausgabe wird ein # vorangestellt. Ein fairer Würfel:

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

Ein vorgespannter Chip mit den Nummern 1 bis 10 hat jeweils eine Wahrscheinlichkeit von 0,045; Diese 11-20 haben eine Wahrscheinlichkeit von 0,055 - 200 Würfen:

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

Wir haben nicht genügend Hinweise auf eine Verzerrung (p = 0,64).

Ein voreingenommener Würfel, 1000 Würfe:

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

Jetzt ist p <0,05 und wir sehen allmählich Hinweise auf eine Voreingenommenheit. Sie können ähnliche Simulationen verwenden, um den Grad der Verzerrung zu schätzen, den Sie bei einem bestimmten p-Pegel erkennen können, und die Anzahl der Würfe, die erforderlich sind, um ihn zu erkennen.

Wow, 2 andere Antworten, noch bevor ich mit dem Tippen fertig war.

Thylacoleo
quelle
Alle Antworten sind ähnlich, aber leicht unterschiedlich. Ich denke nicht, dass es wirklich wichtig ist.
Csgillespie
Danke für die Antwort. Ich habe das akzeptiert, weil es alles Neuling-Zeug über p-Werte und Ablehnung enthielt.
C. Ross
10

Wollen Sie es von Hand oder in Excel machen?

Wenn Sie es in R machen wollen , können Sie es so machen:

Schritt 1: Wirf deinen Würfel (sagen wir mal) 100 Mal.

Schritt 2: Zählen Sie, wie oft Sie jede Ihrer Zahlen erhalten haben

Schritt 3: Setze sie in R wie folgt ein (schreibe die Anzahl der Würfelwürfe, die du hast, anstelle der Zahlen, die ich geschrieben habe):

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

Schritt 4: Führen Sie einfach diesen Befehl aus:

chisq.test(x)

Wenn der P-Wert niedrig ist (z. B. Balg 0,05), ist Ihr Würfel nicht ausbalanciert.

Dieser Befehl simuliert einen ausgeglichenen Würfel (P = ~ .5):

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

Und dies simuliert einen unausgeglichenen Würfel:

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

(Es wird ungefähr P = ~ .005 sein)

Die eigentliche Frage ist nun, wie viele Würfel mit welcher Erkennungsstärke gewürfelt werden sollen. Wenn jemand das lösen möchte, wird er begrüßt ...

Update: Es gibt auch einen schönen Artikel zu diesem Thema finden Sie hier .

Tal Galili
quelle
5
+1 als Referenz: Es ist eine langwierige Abhandlung über das Testen von Werkzeugen in der Praxis. Auf halber Strecke schlägt der Autor die Verwendung eines KS-Tests vor und geht dann auf Möglichkeiten ein, um bestimmte Formen der Abweichung von der Fairness zu identifizieren. Er ist sich auch bewusst, dass Chi-Quadrat eine Näherung für eine kleine Anzahl von Walzen pro Fläche ist (z. B. für 100 Walzen eines 20-seitigen Würfels), dass die Stärke variiert, usw. usw. Kurz gesagt, alles, was das OP möchte Wissen ist übersichtlich.
Whuber
8

n=37

Erstens ist ein Bayesianer, wie @Glen_b sagte, eigentlich nicht daran interessiert, ob der Würfel genau fair ist oder nicht - es ist nicht so. Was ihn interessiert, ist, ob es nah genug ist , was "genug" im Kontext bedeutet, sagen wir, innerhalb von 5% der Fairness für jede Seite.

p1p2p3p=(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

Wie auch immer, hier ist wie (mit R):

Holen Sie sich zunächst einige Daten. Wir würfeln 500 Mal.

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

(Wir beginnen mit einem fairen Würfel; in der Praxis würden diese Daten beobachtet.)

p

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

Lassen Sie uns abschließend unsere hintere Wahrscheinlichkeit abschätzen (nach Beobachtung der Daten), dass der Würfel in jeder Koordinate innerhalb von 0,05 fair liegt.

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

Das Ergebnis ist ungefähr 0.9486 auf meiner Maschine. (Eigentlich keine Überraschung. Wir haben doch mit einem fairen Würfel angefangen.)

Kurze Bemerkung: Es ist wahrscheinlich nicht sinnvoll, in diesem Beispiel einen nicht informativen Prior zu verwenden. Da es wahrscheinlich sogar eine Frage gibt, erscheint der Würfel zunächst ungefähr ausgeglichen. Daher ist es möglicherweise besser, einen Prior zu wählen, der in allen Koordinaten näher an 1/3 konzentriert ist. Darüber hätte unsere geschätzte hintere Wahrscheinlichkeit von "fast fair" einfach noch höher sein können.


quelle
8

Ein Chi-Quadrat-Anpassungstest zielt darauf ab, alle möglichen Arten von Abweichungen von der strengen Homogenität zu finden. Dies ist mit einem d4 oder einem d6 sinnvoll, aber mit einem d20 sind Sie wahrscheinlich mehr daran interessiert zu überprüfen, ob die Wahrscheinlichkeit, dass Sie unter jedem Ergebnis rollen (oder es möglicherweise übertreffen), in der Nähe des Sollwerts liegt.

Ich stelle fest, dass es einige Arten von Abweichungen von der Fairness gibt, die sich stark auf das auswirken, wofür Sie einen d20 verwenden, und andere Arten von Abweichungen, die überhaupt keine Rolle spielen, und der Chi-Quadrat-Test wird die Macht zwischen interessanteren aufteilen und weniger interessante Alternativen. Die Konsequenz ist, dass Sie eine große Anzahl von Rollen benötigen, um genügend Kraft zu haben, um selbst mäßige Abweichungen von der Fairness zu erkennen - weit mehr, als Sie jemals sitzen und generieren möchten.

(Tipp: Überlegen Sie sich ein paar Sätze ungleichmäßiger Wahrscheinlichkeiten für Ihren d20, die sich am stärksten auf das Ergebnis auswirken, für das Sie den d20 verwenden, und verwenden Sie Simulationen und Chi-Quadrat-Tests, um herauszufinden, welche Kraft Sie gegen sie haben verschiedene Rollenzahlen, damit Sie eine Vorstellung von der Anzahl der benötigten Rollen bekommen.)

Es gibt verschiedene Möglichkeiten, nach "interessanten" Abweichungen zu suchen (solche, die die typischen Verwendungszwecke eines d20 mit größerer Wahrscheinlichkeit wesentlich beeinflussen).

Meine Empfehlung ist, einen ECDF-Test (Kolmogorov-Smirnov / Anderson-Darling-Test) durchzuführen. Sie sollten jedoch die Konservativität, die sich aus der Diskretisierung der Verteilung ergibt, berücksichtigen, indem Sie zumindest das nominale Alpha-Niveau, aber auch das Niveau, anheben besser, indem Sie nur die Verteilung simulieren, um zu sehen, wie die Verteilung der Teststatistik für einen d20) aussieht.

Diese können noch jede Art von Abweichung aufnehmen, aber sie legen relativ mehr Gewicht auf die wichtigeren Arten von Abweichungen.

Ein noch leistungsfähigerer Ansatz besteht darin, eine Teststatistik zu erstellen, die speziell auf die für Sie wichtigsten Alternativen abgestimmt ist, jedoch etwas mehr Arbeit erfordert.


In dieser Antwort schlage ich eine grafische Methode zum Testen eines Stempels basierend auf der Größe der einzelnen Abweichungen vor. Wie beim Chi-Quadrat-Test ist dies sinnvoller für Würfel mit wenigen Seiten wie d4 oder d6.

Glen_b - Setzen Sie Monica wieder ein
quelle
7

Wenn Sie nur überprüfen möchten, wie oft jede Zahl angezeigt wird, ist ein Chi-Quadrat-Test geeignet. Angenommen, Sie würfeln N-mal. Sie würden erwarten, dass jeder Wert N / 20-mal auftritt. Alles, was ein Chi-Quadrat-Test macht, ist zu vergleichen, was Sie beobachtet haben, mit dem, was Sie erhalten. Wenn dieser Unterschied zu groß ist, deutet dies auf ein Problem hin.

Andere Tests

Wenn Sie sich zum Beispiel für andere Aspekte der Zufälligkeit interessieren, wenn Sie die folgenden Ergebnisse erzielen:

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

Dann ist diese Ausgabe, obwohl sie die richtige Nummer für jeden einzelnen Wert hat, eindeutig nicht zufällig. In diesem Fall werfen Sie einen Blick auf diese Frage . Dies ist wahrscheinlich nur für elektronische Würfel sinnvoll.

Chi-Quadrat-Test in R

In R wäre dies

##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
csgillespie
quelle
0

Vielleicht sollte man sich nicht so sehr auf einen Satz Rollen konzentrieren.

Versuchen Sie, einen 6-seitigen Würfel 10 Mal zu werfen und wiederholen Sie den Vorgang 8 Mal.

> 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

Sie können überprüfen, ob die Summe für jede Wiederholung 10 ergibt.

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

Für jede Wiederholung (spaltenweise) können Sie die Anpassungsgüte mit dem Chi ^ 2-Test berechnen.

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

Je mehr Würfe du machst, desto weniger voreingenommen wirst du sein. Lassen Sie uns dies für eine große Anzahl tun.

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

Bildbeschreibung hier eingeben

Roman Luštrik
quelle