[RPG] What are the odds of rolling specific ability score totals in D&D

ability-scoresdnd-5estatistics

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.

Best Answer

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.