Gracze określonego TRPG mają postacie z 6 punktami umiejętności, każda z nich w przedziale 3-18. Jedną z metod ich generowania jest wypadnięcie 4k6 najniższej dla każdego z wyników. Oznacza to, że rzucane są czterema sześciokątnymi kośćmi i sumowane są trzy najwyższe wyniki.
Jaka jest oczekiwana największa różnica w sumie wyników umiejętności między 2 z tych 5 graczy?
Powiązane pytanie tutaj pokazuje, jak uzyskać rozkład najniższego spadku 4k3, ale jak mogę stamtąd przejść do odpowiedzi na moje pytanie powyżej?
Dobra odpowiedź wyjaśniłaby wynik w sposób, który może śledzić nowicjusz od statystyki.
Odpowiedź
$ \ newcommand {\ E} {\ mathbb {E}} $ (Piszę to zakładając, że jesteś zaznajomiony z manipulowaniem rozkładami prawdopodobieństwa i oczekiwaniami, ale mam nadzieję, że nic nadzwyczajnego. Daj mi znać, jeśli mam coś więcej wyjaśnić. Robię to również w dość obliczeniowy sposób, aby uzyskać odpowiedź, zamiast próbować zrobić to wszystko ręcznie.)
Powiedzmy, że mamy $ n = 5 $ graczy, z których każdy zwija jeden znak 6 punktów umiejętności, każda oznaczona jako $ X_ {ij} $. Zdefiniuj $ Y_i = \ sum_ {j = 1} ^ 6 X_ {ij} $ jako sumę wyników umiejętności gracza $ i $. Następnie pytasz o oczekiwaną wartość $ Z = \ max_ {i , i „} \ lvert Y_i – Y_ {i”} \ rvert = Y _ {(n)} – Y _ {(1)} $, używając notacji, że $ Y _ {(1)} $ jest pierwszą posortowaną wartością z $ \ {Y_1, \ dots, Y_n \} $ (czyli minimum), a $ Y _ {(n)} $ to $ n $ th (maksimum).
Indywidualne wyniki $ X_ {ij } $
Najłatwiejszym sposobem znalezienia rozkładu $ X_ {ij} $, tak jak w podanej odpowiedzi, jest po prostu brutalne wymuszenie tego, biorąc pod uwagę wszystkie 6 ^ 4 = 1296 $ możliwych rzutów. Oto krótki kod w Pythonie (prawdopodobnie jest lepszy sposób na zrobienie tego …):
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)
Całkowity wynik umiejętności $ Y_i $
Teraz możemy znaleźć rozkład sumy wyników umiejętności, $ Y_i = X_ {i1} + X_ {i2} + \ dots + X_ {i6} $.
Jaki jest rozkład sumy dwóch niezależnych, dyskretnych zmiennych losowych $ A + B $? No cóż, $ \ Pr (A + B = c) = \ sum_ {k = – \ infty} ^ \ infty \ Pr (A = k) \ Pr (B = k – c) $. Okazuje się, że ta operacja jest znana jako splot i na szczęście numpy ma funkcję, która zrobi to za nas. (Prawdopodobny artykuł w Wikipedii nie zawiera zbyt wielu informacji; możesz spróbować rozdział Grinstead i 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)
Najwyższe i najniższe wartości $ Y $
Teraz, gdy znamy rozkład $ Y_i $, nasze pytanie brzmi: jaka jest maksymalna odległość parami między dwoma elementami $ Y $? Alternatywnie, jaka jest różnica między najwyższym a najniższym $ Y $?
Zapisując zmienną, na której nam zależy, jako $ Z = Y _ {(n)} – Y _ {(1)} $, mamy że $ \ EZ = \ E Y _ {(n)} – \ E Y _ {(1)} $, ponieważ oczekiwanie jest liniowe. Oszczędza to pracy, którą wykonałem przy pierwotnym pisaniu tej odpowiedzi, przy obliczaniu wspólnego rozkładu tych dwóch. 🙂
Najpierw zdefiniujmy funkcję dystrybucji skumulowanej (cdf) $ \ Pr (Y \ le y) = \ sum_ {k = 0} ^ y \ Pr (Y = k) $. Następnie cdf $ Y _ {(n)} $ to $$ \ 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 *} $$, ponieważ $ Y_i $ są niezależne. Wówczas, ponieważ $ Y _ {(n)} $ przyjmuje nieujemne wartości całkowite, możemy obliczyć jego oczekiwanie jako $$ \ 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 *} $$ Kod:
n_players = 5 total_cdf = np.cumsum(total_pmf) exp_max = np.sum(1 - total_cdf ** n_players)
pobieranie exp_max
około 81 .5.
Podobnie dla 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 *} $$, a jego oczekiwanie to: $$ \ 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 $$
Kod:
exp_min = np.sum((1 - total_cdf) ** n_players)
otrzymuję exp_min
około 65.3.
Ostateczna spodziewana różnica między najszczęśliwszymi i najgorszymi z 5 graczy to w sumie 16,2 punktów umiejętności. (To trochę dużo!)
Przy okazji wspomniałem, że obliczyłem wspólny rozkład $ Y _ {(1)} $ i $ Y _ {(n)} $ (as $ \ Pr (Y_ {n} = y „) \ Pr (Y _ {(1)} = y \ mid Y _ {(n)} = y”) $). Okazuje się, że dla pięciu graczy rozkład $ Y _ {(n)} – Y _ {(1)} $ wygląda następująco:
Komentarze
- Zwróć uwagę, że może lepiej ocenić jakość zestawu umiejętności na podstawie ich łącznej liczby punktów, a nie ich sumy. Irytujące jest to, że możesz ' t punkt-kup wynik poniżej 7, więc ' nie zawsze jest dobrze zdefiniowany ….