Jucătorii unui anumit TRPG au personaje cu 6 scoruri de abilități, fiecare scor de abilitate variind de la 3-18. O metodă de generare a acestora este de a rula 4d6 picătură cea mai mică pentru fiecare dintre scoruri. Asta înseamnă că sunt lansate patru zaruri cu șase fețe și se adaugă cele mai mari trei rezultate.
Care este cea mai mare diferență așteptată în suma scorurilor de abilitate dintre 2 din cei 5 jucători?
Întrebarea asociată aici arată cum să obținem distribuția 4d3 mai mică, dar cum pot ajunge de acolo la un răspuns la întrebarea mea de mai sus?
Un răspuns bun ar explica rezultatul într-un mod pe care îl poate urma un începător de statistici.
Răspuns
$ \ newcommand {\ E} {\ mathbb {E}} $ (Scriu acest lucru presupunând că sunteți familiarizat cu manipularea distribuțiilor și așteptărilor de probabilitate, dar, sperăm, nimic prea elegant. Spuneți-mi dacă ar trebui să explic ceva mai mult De asemenea, fac asta într-un mod destul de calculat pentru a obține doar un răspuns, mai degrabă decât să încerc să fac totul manual.)
Spunem că avem $ n = 5 $ jucători, fiecare adunând câte un personaj cu 6 scoruri de abilități, fiecare notat ca $ X_ {ij} $. Definiți $ Y_i = \ sum_ {j = 1} ^ 6 X_ {ij} $ pentru a fi suma scorurilor abilităților jucătorului $ i $ th. Apoi vă întrebați despre așteptarea lui $ Z = \ max_ {i , i „} \ lvert Y_i – Y_ {i”} \ rvert = Y _ {(n)} – Y _ {(1)} $, folosind notația că $ Y _ {(1)} $ este prima valoare sortată din $ \ {Y_1, \ dots, Y_n \} $ (adică minimul) și $ Y _ {(n)} $ este $ n $ th (maximul).
Scoruri individuale $ X_ {ij } $
Cel mai simplu mod de a găsi distribuția lui $ X_ {ij} $, ca și în răspunsul pe care l-ați conectat, este să-l forțați brutal, luând în considerare toate $ 6 ^ 4 = 1296 $ role posibile. Iată câteva coduri Python rapide (probabil că există un mod mai bun de a face acest lucru …):
import numpy as np import matplotlib.pyplot as plt def as_kth_of(a, k, n): """vector a => shape (1, ..., 1, a.size, 1, ..., 1) where new shape is length n, a.size is in kth""" return a[(np.newaxis,) * k + (slice(None),) + (np.newaxis,) * (n - k - 1)] def pmf_drop_lowest(sides, number): rolls = np.arange(1, sides + 1) totals = sum(as_kth_of(rolls, k, number) for k in xrange(number)) mins = np.ones_like(totals) * 10000 for k in xrange(number): mins = np.minimum(mins, as_kth_of(rolls, k, number)) return np.bincount((totals - mins).ravel()) / totals.size score_pmf = pmf_drop_lowest(6, 4) plt.bar(np.arange(score_pmf.size) - .5, score_pmf)
Scorul total al abilităților $ Y_i $
Acum putem găsi distribuția sumei scorurilor abilităților, $ Y_i = X_ {i1} + X_ {i2} + \ dots + X_ {i6} $.
Care este distribuția sumei a două variabile aleatoare independente, discrete $ A + B $? Ei bine, $ \ Pr (A + B = c) = \ sum_ {k = – \ infty} ^ \ infty \ Pr (A = k) \ Pr (B = k – c) $. Se pare că această operațiune este cunoscută sub numele de convoluție și, din fericire, numpy are o funcție care să o facă pentru noi. (Articolul legat de Wikipedia nu are multe despre asta pentru probabilitate; ați putea încerca capitolul Grinstead și Snell .)
Cod:
total_pmf = 1 for _ in xrange(6): total_pmf = np.convolve(total_pmf, score_pmf) plt.bar(np.arange(total_pmf.size) - .5, total_pmf)
Cele mai mari și cele mai mici valori de $ Y $
Acum că știm distribuția pentru $ Y_i $, întrebarea noastră este: care este distanța maximă în perechi între două elemente ale $ Y $? Alternativ, care este diferența dintre cel mai mare și cel mai mic $ Y $?
Scriind variabila care ne interesează ca $ Z = Y _ {(n)} – Y _ {(1)} $, avem că $ \ EZ = \ E Y _ {(n)} – \ E Y _ {(1)} $, deoarece așteptarea este liniară. Acest lucru economisește munca pe care am făcut-o la redactarea inițială a acestui răspuns în calculul distribuției comune a celor două. 🙂
Mai întâi, să definim funcția de distribuție cumulativă (cdf) $ \ Pr (Y \ le y) = \ sum_ {k = 0} ^ y \ Pr (Y = k) $. Apoi, cdf-ul lui $ Y _ {(n)} $ este $$ \ begin {align *} \ Pr (Y _ {(n)} \ le y) & = \ Pr \ left (Y_1 \ le y \ text {și} Y_2 \ le y \ text {și} \ dots \ text {și} Y_n \ le y \ right) \\ & = \ prod_ {i = 1} ^ n \ Pr \ left (Y_i \ le y \ right) \\ & = \ Pr (Y \ le y) ^ n \ end {align *} $$ deoarece $ Y_i $ sunt independenți. Apoi, deoarece $ Y _ {(n)} $ ia valori întregi care nu sunt negative, ne putem calcula așteptările ca $$ \ begin {align *} \ E Y _ {(n)} & = \ sum_ {y = 1} ^ \ infty \ Pr (Y _ {(n)} \ ge y) = \ sum_ {y „= 0} ^ \ infty \ Pr (Y _ {(n)} > y”) \\ & = \ sum_ {y „= 0} ^ \ infty \ left (1 – \ Pr (Y _ {(n)} \ le y”) \ right) = \ sum_ {y „= 0} ^ \ infty \ left (1 – \ Pr (Y \ le y „) ^ n \ right). \ End {align *} $$ Cod:
n_players = 5 total_cdf = np.cumsum(total_pmf) exp_max = np.sum(1 - total_cdf ** n_players)
obținerea exp_max
aproximativ 81 .5.
În mod similar, pentru min: $$ \ begin {align *} \ Pr \ left (Y _ {(1)} \ le y \ right) & = 1 – \ Pr \ left (Y _ {(1)} > y \ right) \\ & = 1 – \ Pr \ left (Y_1 > y \ text {și} \ dots \ text {și} Y_n > y \ right) \\ & = 1 – \ Pr \ left (Y_i > y \ right) ^ n \\ & = 1 – \ left (1 – \ Pr \ left (Y \ le y \ right) \ right) ^ {n} \ end {align *} $$ și așteptările sale sunt: $$ \ E Y _ {( 1)} = \ sum_ {y = 0} ^ \ infty \ Pr (Y _ {(1)} > y) = \ sum_ {y = 0} ^ \ infty \ left (1 – \ Pr \ left (Y \ le y \ right) \ right) ^ n $$
Cod:
exp_min = np.sum((1 - total_cdf) ** n_players)
obținând exp_min
aproximativ 65.3.
Diferența finală așteptată dintre cel mai norocos și cel mai nefericit dintre cei 5 jucători este atunci un total de 16,2 puncte de abilitate. (Asta e cam mult!)
Apropo, am menționat că am calculat distribuția comună a $ Y _ {(1)} $ și $ Y _ {(n)} $ (ca $ \ Pr (Y_ {n} = y „) \ Pr (Y _ {(1)} = y \ mid Y _ {(n)} = y”) $). Se pare că pentru cinci jucători, distribuția lui $ Y _ {(n)} – Y _ {(1)} $ arată astfel:
Comentarii
- Rețineți că ar putea fi mai bine să evaluați calitatea unui set de abilități pe baza scorului lor total de cumpărare de puncte, mai degrabă decât a sumei lor. Lucrul enervant la acest lucru este că puteți ' nu cumpărați un scor sub 7, deci ' nu este întotdeauna bine definit ….