15
\$\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\$
  • \$\begingroup\$ Comments are not for extended discussion; this conversation has been moved to chat. \$\endgroup\$ – Rubiksmoose Aug 15 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 at 19:11
29
\$\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\$
  • 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 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 at 18:53
  • 3
    \$\begingroup\$ A more reader-friendly term, especially for the not math-inclined audience the question represents, would be “at least”, as in “odds of the [score/total/whatever] being at least this much”, or whatever nicer phrasing you can think of. \$\endgroup\$ – SevenSidedDie Aug 14 at 21:40
  • 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 at 22:54
  • 2
    \$\begingroup\$ I'm going to throw a 200-pt bounty the way of anyone who wants to take the time to format OP's first 4 code blocks with MathJax. (Because there's 0.00% chance I want to do that on mobile.) Including OP, by the way. \$\endgroup\$ – nitsua60 Aug 15 at 2:32
19
\$\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\$
  • \$\begingroup\$ @LouisWasserman Do you think that explanation is understandable? \$\endgroup\$ – Medix2 Aug 14 at 19:57
  • 4
    \$\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\$ – David Nowlin Aug 14 at 21:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.