La seguente risposta è un po 'noiosa ma sembra essere l'unica fino ad oggi che contiene la risposta veramente esatta ! La normale approssimazione o simulazione o anche solo il calcolo della risposta esatta numericamente a un livello ragionevole di accuratezza, il che non richiede molto tempo, sono probabilmente il modo migliore per procedere - ma se vuoi il modo "matematico" di ottenere la risposta esatta, allora :
Indichiamo con $ X $ la somma dei punti che vediamo nei tiri di dado $ 100 $ , con probabilità funzione di massa $ p_X (x) $ .
Indichi $ Y $ il numero di teste nei $ 600 $ lanci di monete, con funzione di massa di probabilità $ p_Y (y) $ .
Cerchiamo $ P (X > Y) = P (X - Y > 0) = P (D > 0) $ dove $ D = X - Y $ è la differenza tra la somma dei punti e il numero di teste.
Sia $ Z = -Y $ , con funzione di massa di probabilità $ p_Z (z) = p_Y (-z) $ . Quindi la differenza $ D = X - Y $ può essere riscritta come somma $ D = X + Z $ span > il che significa che, poiché $ X $ e $ Z $ sono indipendenti, possiamo trovare la funzione di massa di probabilità di $ D $ prendendo la convoluzione discreta dei PMF di $ X $ span > e $ Z $ :
$$ p_D (d) = \ Pr (X + Z = d) = \ sum_ {k = - \ infty} ^ {\ infty} \ Pr (X = k \ cap Z = d - k) = \ sum_ {k = - \ infty} ^ {\ infty} p_X (k) p_Z (dk) $$
In pratica la somma deve essere fatta solo su valori di $ k $ per i quali le probabilità sono ovviamente diverse da zero. L'idea qui è esattamente ciò che ha fatto @IlmariKaronen, volevo solo scrivere le basi matematiche per questo.
Ora non ho detto come trovare il PMF di $ X $ , che viene lasciato come esercizio, ma nota che se $ X_1, X_2, \ dots, X_ {100} $ sono il numero di punti su ciascuno dei 100 lanci di dadi indipendenti, ciascuno con PMF uniformi discreti su $ \ {1, 2, 3, 4, 5, 6 \} $ , quindi $ X = X_1 + X_2 + \ dots + X_ {100} $ span> e così ...
# Memorizza i PMF delle variabili come frame di dati con le colonne "value" e "prob".
# Importante che i valori siano consecutivi e crescenti per coerenza quando convolgono,
# quindi includi valori intermedi con probabilità 0 se necessario!
# Funzione per verificare se il dataframe è conforme alla precedente definizione di PMF
# Usa message_intro per spiegare quale controllo sta fallendo
is.pmf <- function (x, message_intro = "") {
if (! is.data.frame (x)) {stop (paste0 (message_intro, "Not a dataframe"))}
if (! nrow (x) > 0) {stop (paste0 (message_intro, "Dataframe has no rows"))}
if (! "value"% in% colnames (x)) {stop (paste0 (message_intro, "No 'value' column"))}
if (! "prob"% in% colnames (x)) {stop (paste0 (message_intro, "No 'prob' column"))}
if (! is.numeric (x $ value)) {stop (paste0 (message_intro, "'value' column not numeric"))}
if (! all (is.finite (x $ value))) {stop (paste0 (message_intro, "Does 'value' contains NA, Inf, NaN etc?"))}
if (! all (diff (x $ value) == 1)) {stop (paste0 (message_intro, "'value' not consecutive and ascending"))}
if (! is.numeric (x $ prob)) {stop (paste0 (message_intro, "colonna 'prob' non numerica"))}
if (! all (is.finite (x $ prob))) {stop (paste0 (message_intro, "Does 'prob' contains NA, Inf, NaN etc?"))}
if (! all.equal (sum (x $ prob), 1)) {stop (paste0 (message_intro, "la colonna 'prob' non somma a 1"))}
return (TRUE)
}
# Funzione per convolgere i PMF di x e y
# Notare che per convolgere in R è necessario invertire il secondo vettore
# nome1 e nome2 vengono utilizzati nella segnalazione degli errori per i due input
convolve.pmf <- funzione (x, y, name1 = "x", name2 = "y") {
is.pmf (x, message_intro = paste0 ("Checking", name1, "is valid PMF:"))
is.pmf (y, message_intro = paste0 ("Checking", name2, "is valid PMF:"))
x_plus_y <- data.frame (
value = seq (from = min (x $ value) + min (y $ value),
to = max (x $ value) + max (y $ valore),
di = 1),
prob = convolve (x $ prob, rev (y $ prob), type = "open")
)
return (x_plus_y)
}
# Sia x_i il punteggio dei singoli lanci di dadi i
# Nota PMF di x_i è lo stesso per ogni i = 1 fino a i = 100)
x_i <- data.frame (
valore = 1: 6,
prob = rep (1/6, 6)
)
# Sia t_i il totale di x_1, x_2, ..., x_i
# Memorizzeremo i PMF di t_1, t_2 ... in un elenco
t_i <- list ()
t_i [[1]] <- x_i # t_1 è solo x_1 quindi ha lo stesso PMF
# PMF di t_i è la convoluzione di PMF di t_ (i-1) e x_i
per (i in 2: 100) {
t_i [[i]] <- convolve.pmf (t_i [[i-1]], x_i,
nome1 = incolla0 ("t_i [[", i-1, "]]"), nome2 = "x_i")
}
# Sia x la somma dei punteggi di tutti i 100 lanci di dadi indipendenti
x <- t_i [[100]]
is.pmf (x, message_intro = "Il controllo di x è PMF valido:")
# Sia y il numero di teste in 600 lanci di monete, così ha la distribuzione binomiale (600, 0,5):
y <- data.frame (valore = 0: 600)
y $ prob <- dbinom (y $ valore, dimensione = 600, prob = 0,5)
is.pmf (y, message_intro = "Il controllo di y è PMF valido:")
# Sia z il negativo di y (nota che invertiamo l'ordine per mantenere i valori crescenti)
z <- data.frame (value = -rev (y $ value), prob = rev (y $ prob))
is.pmf (z, message_intro = "Il controllo di z è PMF valido:")
# Sia d la differenza, d = x - y = x + z
d <- convolve.pmf (x, z, name1 = "x", name2 = "z")
is.pmf (d, message_intro = "Il controllo di d è PMF valido:")
# Prob (X > Y) = Prob (D > 0)
somma (d [d $ valore > 0, "prob"])
# [1] 0.9907902
Provalo online!
Non che abbia importanza praticamente se stai solo cercando una ragionevole precisione, poiché il codice sopra viene eseguito comunque in una frazione di secondo, ma c'è una scorciatoia per eseguire le convoluzioni per la somma di 100 variabili indipendenti distribuite in modo identico: da 100 = 64 + 32 + 4 quando espresso come somma di potenze di 2, puoi continuare a convolgere il più possibile le tue risposte intermedie con se stesse. Scrivendo i subtotali per i primi $ i $ tiri dado come $ T_i = \ sum_ {k = 1} ^ {k = i} X_k $ possiamo ottenere i PMF di $ T_2 = X_1 + X_2 $ , $ T_4 = T_2 + T_2 '$ (dove $ T_2' $ è indipendente da $ T_2 $ ma ha lo stesso PMF) e in modo simile $ T_8 = T_4 + T_4 '$ , $ T_ {16} = T_8 + T_8' $ , $ T_ {32} = T_ {16} + T_ {16} '$ e $ T_ {64} = T_ {32} + T_ {32} "$ . Abbiamo bisogno di altre due convoluzioni per trovare il punteggio totale di tutti i 100 dadi come somma di tre variabili indipendenti, $ X = T_ {100} = (T_ {64} + T_ {32} '') + T_4 '' $ e una convoluzione finale per $ D = X + Z $ . Quindi penso che tu abbia bisogno solo di nove convoluzioni in tutto - e per l'ultima, puoi limitarti alle parti della convoluzione che danno un valore positivo per $ D $ . Oppure, se è meno complicato, le parti che forniscono valori non positivi per $ D $ e quindi prendono il complemento. A condizione che tu scelga il modo più efficiente, credo che ciò significhi che il tuo caso peggiore è effettivamente otto circonvoluzioni e mezzo. EDIT: e come suggerisce @whuber, anche questo non è necessariamente ottimale!
Usando il metodo a nove convoluzioni che ho identificato, con il pacchetto gmp in modo da poter lavorare con oggetti bigq
e scrivere un ciclo non ottimizzato da fare le convoluzioni (dato che il metodo integrato di R non si occupa degli input di bigq
), ci sono voluti solo un paio di secondi per calcolare l'esatta frazione semplificata:
1342994286789364913259466589226414913145071640552263974478047652925028002001448330257335942966819418087658458889485712017471984746983053946540181650207455490497876104509955761041797420425037042000821811370562452822223052224332163891926447848261758144860052289/1355477899826721990460331878897812400287035152117007099242967137806414779868504848322476153909567683818236244909105993544861767898849017476783551366983047536680132501682168520276732248143444078295080865383592365060506205489222306287318639217916612944423026688
che in effetti arrotondano a 0,9907902. Ora per la risposta esatta, non avrei voluto farlo con troppe altre convoluzioni, potevo sentire gli ingranaggi del mio laptop iniziare a scricchiolare!