6
\$\begingroup\$

I need some math help to determine what an average character that survived a DCC funnel is like.

When playing a funnel in Dungeon Crawl Classics, players get 4 characters each. Should they survive, the player picks one character to continue playing. On average, what is the sum of the best character's ability score bonuses? The "best" character simply meaning the one with the greatest sum out of the four.

In DCC, you roll 3d6 for all 6 ability scores. Here are the bonuses for each score:

Ability Score Bonus
3 -3
4-5 -2
6-8 -1
9-12 0
13-15 +1
16-17 +2
18 +3

It's simple to figure out the average bonus sum for making 1 character: 0 (I think), but the average highest of four is beyong my meager statistical knowledge. Any help is appreciated.

Obviously the survivor of a funnel won't always be the optimal choice, but players often protect that character and only play riskily with the sub-par characters.

\$\endgroup\$

2 Answers 2

6
\$\begingroup\$

I believe @Dale M's answer is on the right track. I took a stab at a similar dyce¹-based solution, which I outline below. You can see my full attempt and play around with it in your browser: Try dyce [source]

The punchline is that choosing best-of-four stat blocks based on their cumulative bonuses gets you a mean cumulative bonus of about 2.3 with a standard deviation of about 1.6.

That being said, I'm not sure how well this models actual game play. There may be a correlation between "better" stat blocks and surviving the funnel, but it depends a lot on the nature of the funnel. Also, keep in mind that a cumulative bonus doesn't tell us much. (-3, -2, 0, 1, +3, +3) nets the same as (-1, 0, 0, 0, 1, 2), but those are likely very different characters to play. If the funnel favors a particular stat, that will skew things. If the funnel is mostly dumb luck, that will affect outcomes. If a player favors one particular character over the others, and uses the less favored as shields or resources dedicated to protecting the favorite, that will heavily affect outcomes.


To get to our mean, we first compute the bonus distribution for a single stat.

d6 = H(6)
stat = 3@d6
stat_to_bonus_map = {
    3: -3,
    4: -2, 5: -2,
    6: -1, 7: -1, 8: -1,
    9: 0, 10: 0, 11: 0, 12: 0,
    13: +1, 14: +1, 15: +1,
    16: +2, 17: +2,
    18: +3,
}

def stat_to_bonus(stat: HResult) -> int:
    return stat_to_bonus_map[stat.outcome]

bonus_for_single_stat = foreach(stat_to_bonus, stat=stat)
print(f"bonus: {bonus_for_single_stat}")
print(f"bonus.total: {bonus_for_single_stat.total}")

This gives us the equivalent of a single die that maps 3d6 to the appropriate bonus.

bonus: H({-3: 1, -2: 9, -1: 46, 0: 104, 1: 46, 2: 9, 3: 1})
bonus.total: 216

If we visualize, we can see that just under half the time, we'll get a bonus of zero (for outcomes 9-12 on 3d6) for a single stat.

Single Stat

Now we want to compute the cumulative (net) bonuses across all six stats.

bonus_for_six_stats = 6@bonus_for_single_stat

Your intuition is correct that the mean of the total is also zero.

Cumulative Bonus for All Six Stats

Finally, we compute the distribution for taking the best-of-four attempts.

character_pool = 4@P(bonus_for_six_stats)
best_of_four_bonus_for_six_stats = character_pool.h(-1)

Best-of-Four Cumulative Bonus

The attached burst graphs are generated from that notebook using anydyce².


¹ dyce is my Python dice probability library.

² anydyce is my visualization layer for dyce meant as a rough stand-in for AnyDice.

\$\endgroup\$
10
\$\begingroup\$

2.292

As per this anydice:

BONUS: {-3,-2:9,-1:46,0:104,1:46,2:9,3}

output [highest 1 of 4d(6dBONUS)]

BONUS is a 216-sided dice representing the bonus obtained from rolling 3d6 and using your table. 6dBONUS is the distribution of bonuses across 6 stats. And then we take the highest one of 4 of these.

\$\endgroup\$
1
  • 1
    \$\begingroup\$ Also, I think your answer would be improved if you could show how to construct BONUS. \$\endgroup\$
    – posita
    Commented Sep 12, 2022 at 12:34

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .