Spelare i en viss TRPG har tecken med 6 förmånspoäng, varje förmånspoäng varierar från 3-18. En metod för att generera dessa är att rulla 4d6 droppe lägst för var och en av poängen. Det betyder att fyra tärningar med sex ansikten kastas och de tre högsta resultaten läggs till.
Vad är den förväntade högsta skillnaden i summan av förmånspoängen mellan 2 av dessa 5 spelare?
Den relaterade frågan här visar hur man får fördelningen av 4d3 droppe lägst, men hur får jag därifrån till svaret på min fråga ovan?
Ett bra svar skulle förklara resultatet på ett sätt som en statistiknybörjare kan följa.
Svar
$ \ newcommand {\ E} {\ mathbb {E}} $ (jag skriver detta förutsatt att du är bekant med att manipulera sannolikhetsfördelningar och förväntningar, men förhoppningsvis inget för snyggt. Låt mig veta om jag skulle förklara något mer. Jag gör det också på ett ganska beräkningsmässigt sätt för att bara få ett svar snarare än att försöka göra allt för hand.)
Säg att vi har $ n = 5 $ spelare som vardera rullar upp en karaktär med 6 förmånspoäng, vardera betecknade som $ X_ {ij} $. Definiera $ Y_i = \ sum_ {j = 1} ^ 6 X_ {ij} $ för att vara summan av $ i $ th spelarens förmånspoäng. Sedan frågar du om förväntningen på $ Z = \ max_ {i , i ”} \ lvert Y_i – Y_ {i”} \ rvert = Y _ {(n)} – Y _ {(1)} $, med noteringen att $ Y _ {(1)} $ är det första sorterade värdet från $ \ {Y_1, \ dots, Y_n \} $ (dvs. minimum) och $ Y _ {(n)} $ är $ n $ th (max).
Individuella poäng $ X_ {ij } $
Det enklaste sättet att hitta fördelningen av $ X_ {ij} $, som i svaret du länkade, är att bara tvinga det genom att överväga alla $ 6 ^ 4 = 1296 $ möjliga rullar. Här är lite snabb Python-kod (det är förmodligen ett bättre sätt att göra detta …):
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)
Total förmånspoäng $ Y_i $
Nu kan vi hitta fördelningen av summan av förmånspoäng, $ Y_i = X_ {i1} + X_ {i2} + \ dots + X_ {i6} $.
Vad är fördelningen av summan av två oberoende, diskreta slumpmässiga variabler $ A + B $? Nåväl, $ \ Pr (A + B = c) = \ sum_ {k = – \ infty} ^ \ infty \ Pr (A = k) \ Pr (B = k – c) $. Det visar sig att denna operation är känd som konvolution och lyckligtvis har numpy en funktion för att göra det åt oss. (Den länkade Wikipedia-artikeln har inte mycket om det för sannolikhet; du kan prova detta kapitel i Grinstead och Snell .)
Kod:
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)
Högsta och lägsta värden på $ Y $
Nu när vi vet fördelningen för $ Y_i $ är vår fråga: vad är det maximala paravståndet mellan två element av $ Y $? Alternativt, vad är skillnaden mellan den högsta och den lägsta $ Y $?
När vi skriver variabeln som vi bryr oss om som $ Z = Y _ {(n)} – Y _ {(1)} $ har vi att $ \ EZ = \ E Y _ {(n)} – \ E Y _ {(1)} $, eftersom förväntningarna är linjära. Detta sparar det arbete som jag gjorde när jag ursprungligen skrev upp detta svar vid beräkning av den gemensamma fördelningen av de två. 🙂
Låt oss först definiera den kumulativa fördelningsfunktionen (cdf) $ \ Pr (Y \ le y) = \ sum_ {k = 0} ^ y \ Pr (Y = k) $. Därefter är cdf för $ Y _ {(n)} $ $$ \ begin {align *} \ Pr (Y _ {(n)} \ le y) & = \ Pr \ left (Y_1 \ le y \ text {and} Y_2 \ le y \ text {and} \ dots \ text {and} Y_n \ le y \ right) \\ & = \ prod_ {i = 1} ^ n \ Pr \ left (Y_i \ le y \ right) \\ & = \ Pr (Y \ le y) ^ n \ end {align *} $$ eftersom $ Y_i $ är oberoende. Eftersom $ Y _ {(n)} $ tar icke-negativa heltal, kan vi beräkna dess förväntningar som $$ \ 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 \ höger). \ Slut {align *} $$ Kod:
n_players = 5 total_cdf = np.cumsum(total_pmf) exp_max = np.sum(1 - total_cdf ** n_players)
får exp_max
cirka 81 .5.
På samma sätt, för min: $$ \ begin {align *} \ Pr \ left (Y _ {(1)} \ le y \ right) & = 1 – \ Pr \ left (Y _ {(1)} > y \ right) \\ & = 1 – \ Pr \ left (Y_1 > y \ text {and} \ dots \ text {and} 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 *} $$ och dess förväntningar är: $$ \ E Y _ {( 1)} = \ sum_ {y = 0} ^ \ infty \ Pr (Y _ {(1)} > y) = \ sum_ {y = 0} ^ \ infty \ left (1 – \ Pr \ vänster (Y \ le y \ höger) \ höger) ^ n $$
Kod:
exp_min = np.sum((1 - total_cdf) ** n_players)
får exp_min
ungefär 65.3.
Den slutliga förväntade skillnaden mellan den lyckligaste och olyckligaste av 5 spelare är då totalt 16,2 förmånspoäng. (Det är ganska mycket!)
Förresten nämnde jag att jag beräknade den gemensamma fördelningen av $ Y _ {(1)} $ och $ Y _ {(n)} $ (som $ \ Pr (Y_ {n} = y ”) \ Pr (Y _ {(1)} = y \ mid Y _ {(n)} = y”) $). Det visar sig att för fem spelare är distribution av $ Y _ {(n)} – Y _ {(1)} $ ser ut så här:
Kommentarer
- Observera att det kan vara bättre att utvärdera kvaliteten på en uppsättning förmågor baserat på deras totala poängköpspoäng, snarare än deras summa. Det irriterande med det är att du kan ' t-köp en poäng under 7, så det ' är inte alltid väldefinierad ….