20
\$\begingroup\$

I am about to start running a new game in 5e and I hate all of the ways of determining ability scores.

I have always felt that we play RPGs at least in part for the opportunity to pretend to be more than we are in real life and no one wants to play a character who's just average. So I feel like characters should have the ability to become world-class in some area.

Using either standard array or point buy, you cannot start at level 1 with greater than a 15 in any ability. This means that you can't have above a 17 with racial mods and that, in order, to achieve the highest possible level of 20, you must plan to use at least two feat opportunities to improve to 20, and you have essentially no chance of improving a secondary ability to anything significant if you want to take any non-ability feats at all.

And with rolling dice, you may have some chance of starting in a better position, but you have a significant chance of starting in a much worse position. If the consequences of such a catastrophe were a few sessions of difficulty, that would be one thing, but leaving to chance the possibility of playing, for months or a year, a character whose negative modifiers outweigh their positive ones seems unacceptable to me.

For this reason, I think, some DMs (including Matt Mercer from Critical Role) put lower caps on rolls, saying, for example, that if your total rolls for all six stats are below 70, you can roll again.

I like this idea, but I'm not sure it's sufficient for what I want (giving my players a chance to be exceptional).

I know that there are 1296 possible results for rolling 4D6, and I know that the average result of rolling 4D6 and dropping the lowest number is 12.2446, which means (I think) that the average score for doing that six times is 73.46759.

I'm thinking about making 73 the "floor" for my players (so that they are at least hero-average so to speak) but I'm not sure I have a good enough grasp of the math to know that that is the right decision.

What I'd like to know is "what is the probability of getting a total of under 70 on these rolls?" So, if you roll 4D6 and drop the lowest one six times and total the six results, what is the probability that it is below 70?

I'd also like to know that for 71, 72, etc... up to 78. And I'd like to know what the probability of getting above about 80 is, and 81, 82, etc.. up to about 90.

I'm not a mathematician and I don't know how to figure this out. I don't even really know how to phrase the question. I hope this was clear enough to get an answer.


Wow! This is my first time asking a question here and I had no idea to expect such amazing responses so fast. I really appreciate your efforts in educating me on this issue. Thank you very much.

\$\endgroup\$
2
  • \$\begingroup\$ Comments are not for extended discussion; this conversation has been moved to chat. \$\endgroup\$
    – Rubiksmoose
    Aug 15 '19 at 15:35
  • \$\begingroup\$ @Belgabad I appreciate you trying to help OP, but a partial answer is still an answer and is not what comments are for here. The appropriate place to put answers are in an answer. If you wanted, there is a chat link here where you can contribute to more discussion. \$\endgroup\$
    – Rubiksmoose
    Aug 15 '19 at 19:11
35
\$\begingroup\$

PCs are exceptional regardless of their ability scores

Answering your actual question rather than the math one first: Your hang-up is that you place too much emphasis on ability scores. A fighter is already exceptional just for being a fighter, just as a wizard, cleric or druid are already exceptional for belonging to these classes. Ability scores influence things the characters can do, but that's at best describing the relative strengths of PCs against each other - and even then it's a very inexact and misleading measure, my dwarf barbarian with 28 strength is not really more exceptional than sorcerer with their highest stat being a 17 in charisma, but with the ability to destroy castles at a whim via Earthquake.

Thus, I don't believe your problem can be solved via math, certainly not by slightly tweaking the ability scores players get; It's more a matter of framing PCs as larger than life heroes, which is very much within your purview as a DM.

The literal math question

Here are the exact (to six significant digits) probabilities of both getting the individual scores and getting a score that is at least as great as a particular score (using the 4d6 drop lowest system). But like I said earlier, I'm not sure that knowing this will improve matters much for you (note that an "average" human is assumed to have values at around 10 (see also the Commoner Statblock):

Individual Score Probabilities

\$ \begin{array}{c|c|c} \text{Ability Score} & \text{Probability} & {\text{Probability of being}\\\text{at least as great as}}\\\hline 18 & 1.620370\% & 1.620370\%\\ 17 & 4.166667\% & 5.787037\%\\ 16 & 7.253086\% & 13.040123\%\\ 15 & 10.108025\% & 23.148148\%\\ 14 & 12.345679\% & 35.493827\%\\ 13 & 13.271605\% & 48.765432\%\\ 12 & 12.885802\% & 61.651235\%\\ 11 & 11.419753\% & 73.070988\%\\ 10 & 9.413580\% & 82.484568\%\\ 9 & 7.021605\% & 89.506173\%\\ 8 & 4.783951\% & 94.290123\%\\ 7 & 2.932099\% & 97.222222\%\\ 6 & 1.620370\% & 98.842593\%\\ 5 & 0.771605\% & 99.614198\%\\ 4 & 0.308642\% & 99.922840\%\\ 3 & 0.077160\% & 100.000000\%\\ \end{array} \$

Expected single ability score value: 12.24

Expected total: 73.47 (as you suspected in the question)

And here are the probabilities for score totals (up to 6 significant digits). Note that there are a bunch of zeros and 100%s in here, these are mostly because the chances are just so astronomically small or big that 6 significant digits aren't enough (except for the accumulated probabilities for minimum values, since of course nothing can be smaller than the minimum).

Total score probabilites

\$ \begin{array}{c|c|c} \text{Total Score} & \text{Probability} & {\text{Probability of being}\\\text{at least as great as}}\\\hline 108 & 0.000000\% & 0.000000\%\\ 107 & 0.000000\% & 0.000000\%\\ 106 & 0.000000\% & 0.000000\%\\ 105 & 0.000001\% & 0.000002\%\\ 104 & 0.000006\% & 0.000007\%\\ 103 & 0.000022\% & 0.000030\%\\ 102 & 0.000073\% & 0.000102\%\\ 101 & 0.000212\% & 0.000314\%\\ 100 & 0.000559\% & 0.000873\%\\ 99 & 0.001355\% & 0.002228\%\\ 98 & 0.003053\% & 0.005280\%\\ 97 & 0.006438\% & 0.011719\%\\ 96 & 0.012800\% & 0.024518\%\\ 95 & 0.024120\% & 0.048638\%\\ 94 & 0.043277\% & 0.091916\%\\ 93 & 0.074221\% & 0.166137\%\\ 92 & 0.122070\% & 0.288207\%\\ 91 & 0.193078\% & 0.481284\%\\ 90 & 0.294415\% & 0.775699\%\\ 89 & 0.433730\% & 1.209429\%\\ 88 & 0.618481\% & 1.827910\%\\ 87 & 0.855065\% & 2.682974\%\\ 86 & 1.147820\% & 3.830794\%\\ 85 & 1.498018\% & 5.328812\%\\ 84 & 1.902979\% & 7.231791\%\\ 83 & 2.355468\% & 9.587259\%\\ 82 & 2.843496\% & 12.430755\%\\ 81 & 3.350615\% & 15.781370\%\\ 80 & 3.856750\% & 19.638120\%\\ 79 & 4.339492\% & 23.977612\%\\ 78 & 4.775768\% & 28.753380\%\\ 77 & 5.143685\% & 33.897065\%\\ 76 & 5.424356\% & 39.321421\%\\ 75 & 5.603493\% & 44.924914\%\\ 74 & 5.672574\% & 50.597488\%\\ 73 & 5.629472\% & 56.226960\%\\ 72 & 5.478471\% & 61.705431\%\\ 71 & 5.229710\% & 66.935141\%\\ 70 & 4.898120\% & 71.833262\%\\ 69 & 4.502022\% & 76.335284\%\\ 68 & 4.061548\% & 80.396832\%\\ 67 & 3.597061\% & 83.993893\%\\ 66 & 3.127736\% & 87.121629\%\\ 65 & 2.670427\% & 89.792056\%\\ 64 & 2.238874\% & 92.030931\%\\ 63 & 1.843300\% & 93.874230\%\\ 62 & 1.490344\% & 95.364575\%\\ 61 & 1.183308\% & 96.547883\%\\ 60 & 0.922602\% & 97.470485\%\\ 59 & 0.706332\% & 98.176817\%\\ 58 & 0.530938\% & 98.707756\%\\ 57 & 0.391803\% & 99.099559\%\\ 56 & 0.283804\% & 99.383363\%\\ 55 & 0.201753\% & 99.585116\%\\ 54 & 0.140730\% & 99.725846\%\\ 53 & 0.096296\% & 99.822142\%\\ 52 & 0.064621\% & 99.886763\%\\ 51 & 0.042516\% & 99.929279\%\\ 50 & 0.027414\% & 99.956693\%\\ 49 & 0.017318\% & 99.974011\%\\ 48 & 0.010713\% & 99.984724\%\\ 47 & 0.006487\% & 99.991211\%\\ 46 & 0.003842\% & 99.995053\%\\ 45 & 0.002225\% & 99.997279\%\\ 44 & 0.001259\% & 99.998538\%\\ 43 & 0.000696\% & 99.999233\%\\ 42 & 0.000375\% & 99.999608\%\\ 41 & 0.000197\% & 99.999805\%\\ 40 & 0.000101\% & 99.999905\%\\ 39 & 0.000050\% & 99.999956\%\\ 38 & 0.000024\% & 99.999980\%\\ 37 & 0.000011\% & 99.999991\%\\ 36 & 0.000005\% & 99.999996\%\\ 35 & 0.000002\% & 99.999998\%\\ 34 & 0.000001\% & 99.999999\%\\ 33 & 0.000000\% & 100.000000\%\\ 32 & 0.000000\% & 100.000000\%\\ 31 & 0.000000\% & 100.000000\%\\ 30 & 0.000000\% & 100.000000\%\\ 29 & 0.000000\% & 100.000000\%\\ 28 & 0.000000\% & 100.000000\%\\ 27 & 0.000000\% & 100.000000\%\\ 26 & 0.000000\% & 100.000000\%\\ 25 & 0.000000\% & 100.000000\%\\ 24 & 0.000000\% & 100.000000\%\\ 23 & 0.000000\% & 100.000000\%\\ 22 & 0.000000\% & 100.000000\%\\ 21 & 0.000000\% & 100.000000\%\\ 20 & 0.000000\% & 100.000000\%\\ 19 & 0.000000\% & 100.000000\%\\ 18 & 0.000000\% & 100.000000\%\\ \end{array} \$

Source code for generating the table (Haskell)

{-# LANGUAGE Strict, TypeApplications #-}
import qualified Data.Map as M
import Text.Printf
import Data.List(sortBy)
import Data.Ord(comparing)
import Control.Applicative((<|>))
import Data.Ratio

rolls :: [Int]
rolls = do
  a <- dice
  b <- dice
  c <- dice
  d <- dice
  return . sum . take 3 . sortBy (comparing negate) $ [a,b,c,d] where
  dice = [1..6]

frequencies :: M.Map Int Int
frequencies = foldr (\v m -> M.alter (\f -> fmap (+1) f <|> Just 1) v m) M.empty rolls

probabilities :: M.Map Int Rational
probabilities = fmap ((/ 6^4) . fromIntegral) frequencies

printProb :: Int -> Rational -> Rational -> IO ()
printProb k p acc = printf "%d & %.6f\\%% & %.6f\\%%\\\\\n" k (percent p) (percent acc) where
  percent = fromRational @Double . (100*)

totalScoreInstances :: [(Int, Rational)]
totalScoreInstances = do
  (strength, pStr) <- oneScore
  (constitution, pCon) <- oneScore
  (dexterity, pDex) <- oneScore
  (wisdom, pWis) <- oneScore
  (intelligence, pInt) <- oneScore
  (charisma, pCha) <- oneScore
  let totalScore
        = strength
        + constitution
        + dexterity
        + wisdom
        + intelligence
        + charisma
  let totalProb
        = pStr
        * pCon
        * pDex
        * pWis
        * pInt
        * pCha
  return (totalScore, totalProb)
  where oneScore = M.toList probabilities

totalScoreProbabilities :: M.Map Int Rational
totalScoreProbabilities = foldl
  (\m (s, p) -> M.alter (\tp -> fmap (+ p) tp <|> Just p) s m)
  M.empty
  totalScoreInstances 

main = do
  putStrLn "## Individual Score Probabilities"
  putStrLn "\\$"
  putStrLn "\\begin{array}{c|c|c}"
  putStrLn "\\text{Ability Score} & \\text{Probability} & \\text{Probability of being at least as great as}\\\\\\hline"
  fst $ M.foldrWithKey (\k v (m,acc)  -> let acc' = acc+v in (m >> printProb k v acc', acc')) (return (), 0) probabilities
  putStrLn "\\end{array}"
  putStrLn "\\$"
  let expected = M.foldlWithKey (\t k v -> t + (fromIntegral k * v)) 0.0 probabilities
  printf "Expected single ability score value: %.2f\n" $ fromRational @Double expected
  printf "\nExpected total: %.2f\n" $ fromRational @Double expected * 6
  putStrLn "## Total score probabilites"
  putStrLn "\\$"
  putStrLn "\\begin{array}{c|c|c}"
  putStrLn "\\text{Total Score} & \\text{Probability} & \\text{Probability of being at least as great as}\\\\\\hline"
  fst $ M.foldrWithKey (\k v (m,acc) -> let acc' = acc+v in (m >> printProb k v acc', acc')) (return (), 0) totalScoreProbabilities
  putStrLn "\\end{array}"
  putStrLn "\\$"

Note: if you want to run this yourself, compile with ghc -O2 and don't try to run it via the interpreter if you want to see the result before the heat death of the universe.

\$\endgroup\$
5
  • 8
    \$\begingroup\$ It might be worth mentioning that the ability score system is set up with 10/11 being human average in that ability (which supports your argument that even with a low point-buy, PCs end up being more or less exceptional). \$\endgroup\$
    – Rubiksmoose
    Aug 14 '19 at 18:00
  • 3
    \$\begingroup\$ Note that anydice presents this in a prettier way, but this does present an easy way to calculate these things - literally just enumerate all the possible outcomes and sum up their probabilities. I don't know how anydice works, whether it's by sampling or if they actually use some exact analysis. I'm not a statistician so I'm doing it the naive way here. \$\endgroup\$
    – Cubic
    Aug 14 '19 at 18:53
  • 3
    \$\begingroup\$ @Cubic anydice gives you exact results, unless you exceed its limitations on recursive functions, or you deliberately hack together an anydice program which does things in a sampling way (usually only attempted because the exact way takes too long for the server to be able to compute). \$\endgroup\$
    – Carcer
    Aug 14 '19 at 22:54
  • 3
    \$\begingroup\$ This question is amazing, but overlooks a core concept that the OP probably unconsciously overlooked as well. The OP really only cares about 2 out of the 6 scores. So it's worth noting that it will be 'common' for the top score to be around the 16th percentile (ish): 15-16, and the second highest score to be around the 33rd percentile (ish): 14-15. (If you continue this pattern, you get the standard array) \$\endgroup\$ Aug 15 '19 at 17:54
  • \$\begingroup\$ @Mooing my main point was really about ability scores being overrated (not that they're unimportant, just not nearly as important as op thought they were). I really included the table only to avoid accusations of dodging the question, I'm not extremely interested in having a full discussion on the minituae of stat distributions in this answer. \$\endgroup\$
    – Cubic
    Aug 16 '19 at 13:55
21
\$\begingroup\$

Here is an anydice program that does what you wanted

https://anydice.com/program/171e4
The code:

T: 0
loop X over {1..6}
{
 R:[highest 3 of 4d6]
 T: T+R 
}
output T

How it works:

  1. We define a variable, T to be equal to 0.
  2. Then we run the bracketed section the first time.
  3. Each time a variable, R, is the result of 4d6 drop the lowest.
  4. We add the variable R to T.
    Then we run the bracketed section another five times (increasing T by R for each new roll).
  5. Finally we have our out variable T, which is the sum of all 6 of our rolls.

You can click various buttons in the link to view different statistics, for example "At Most" will show you totals on the far-left and the percent chance of getting at most that total to its right.

We can see that the odds of getting at most 70 is 33.06%
The odds of getting at most 78 is 76.02%
The odds of getting at least 80 is 19.64%
The odds of getting at least 90 is .78%


An alternative code method of doing this is the following as pointed out by @Sdjz:
https://anydice.com/program/171e5

output [highest 3 of 4d6] + [highest 3 of 4d6]+ [highest 3 of 4d6]+ [highest 3 of 4d6]+ [highest 3 of 4d6]+ [highest 3 of 4d6]

Their code does the same thing in an arguably easier to read way or more obvious/intuitive way, simply adding together six rolls of "4d6 drop the lowest".

graph of probabilities


Yet another equivalent method was brought up by @LouisWasserman found at this link: https://anydice.com/program/171f0

output 6d[highest 3 of 4d6]

This works because when anydice rolls dice, for example 3d6, it rolls 1d6 three times and adds the results together.
Their code has it roll six dice with "4d6 drop the lowest" sides.
It then adds together the results which is equivalent to the other two methods above.

\$\endgroup\$
1
  • 5
    \$\begingroup\$ Thank you very much for your answer. I had a little trouble following it because I am not familiar with "any dice" (thought it sounds like something I should look into). After reading both this one and the next one I had a good enough grasp on the answers to check them against each other, discover that you both arrived at the same conclusions, and understand those conclusions. So thanks! \$\endgroup\$ Aug 14 '19 at 21:58

You must log in to answer this question.

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