35
\$\begingroup\$

The D&D 3.5 Player's Handbook gives (among others) two preferred methods to roll ability scores for a new character: a) roll 3d6 twelve times and keep the preferred six results, or b) roll 4d6 and drop the lowest die, six times.

What is the statistically better method in terms of total modifiers?

In addition, IIRC the core rulebook excludes characters whose total bonus is lower than +3, because adventurers are assumed to be exceptional people.

\$\endgroup\$
0

8 Answers 8

17
\$\begingroup\$

If you actually get a standard distribution from the dice in the 3d6 x12 method, it will be slightly better than a standard distribution of results from the 4d6 method. The more samples you take, the more likely it is that you will get something approaching average or a standard distribution. The fewer samples you take, the more likely the results will just be random.

\$\endgroup\$
6
  • \$\begingroup\$ +1 Beat me to it. With more dice the bell curve gets taller and narrower in the middle. \$\endgroup\$ Commented Aug 27, 2010 at 19:57
  • 1
    \$\begingroup\$ I think he's asking which gives better average stats, though? So the average for 12 runs of 3d6 will be lower, but what're the chances you'll get more peaks? \$\endgroup\$
    – Bryant
    Commented Aug 27, 2010 at 20:08
  • \$\begingroup\$ It seems you are right. I run some additional check and then post the graph. \$\endgroup\$ Commented Aug 27, 2010 at 20:14
  • \$\begingroup\$ Bryant - The average doesn't really matter a whole lot because the sample sizes are 12 vs. 6. With 6, the results will be pretty random with no room to ignore outliers. With 12, the results are still pretty random in distribution, but you can ignore results that are unfavorable. \$\endgroup\$
    – Mike B
    Commented Aug 27, 2010 at 20:56
  • 1
    \$\begingroup\$ @bySwarm: you are absolutely right with the "no room to ignore outliers". I'd like to comment though that excluding the lowest die in the 4d6 set technically reduces the chance of an outlier. However, a very bad throw (e.g. 3,2,1,1), forces you accept the resulting 6 due to the effect you report \$\endgroup\$ Commented Aug 27, 2010 at 21:02
49
\$\begingroup\$

I appears that bySwarm is right. Here are the results:

alt text

along the X axis is the total bonus over the six ability scores. Along the Y axis, the probability, obtained from 1 million runs. Results below a total bonus of +3 have been purged from the count, so the grand total of runs is less than the original 1 million.

It appears that the twelve 3d6 statistically produces a better total bonus than the 4d6 method.

This is the code to run the 4d6 case (in Python)

import sys
import random

count = {}
for i in xrange(1,1000000):
    collection = []
    for j in xrange(0,6):
        extraction = [random.randint(1,6), random.randint(1,6), random.randint(1,6), random.randint(1,6) ]
        #print extraction
        collection.append( sum( sorted( extraction )[1:] ) )
    #print collection 
    bonuses = map(lambda x: (x-10)/2, collection)
    #print bonuses
    total_bonus = sum(bonuses)
    #print total_bonus

    if total_bonus < 3:
        #print "too low, excluded"
        continue

    if not count.has_key(total_bonus):
        count[total_bonus]=0
    count[total_bonus] += 1

total_extractions = sum(count.values())
for bonus,occurrences in sorted(count.items()):
    print bonus,occurrences/float(total_extractions)

This is for the twelve 3d6 case:

import random

count = {}
for i in xrange(1,1000000):
    collection = []
    for j in xrange(0,12):
        extraction = [random.randint(1,6), random.randint(1,6), random.randint(1,6) ] 
        collection.append( sum( extraction ) )
    ##print collection
    collection = sorted(collection)[6:]
    #print collection

    bonuses = map(lambda x: (x-10)/2, collection)
    #print bonuses
    total_bonus = sum(bonuses)
    #print total_bonus

    if total_bonus < 3:
        #print "too low, excluded"
        continue

    if not count.has_key(total_bonus):
        count[total_bonus]=0
    count[total_bonus] += 1

total_extractions = sum(count.values())
for bonus,occurrences in sorted(count.items()):
    print bonus,occurrences/float(total_extractions)
\$\endgroup\$
0
17
\$\begingroup\$

It might be true that the 3d6 method will get you more total modifiers on average, but I think it is important to note that if one is building a Wizard and truly min-maxing, that player would be hoping to roll a single 17 or 18 most of all.

The probability to roll an 18 on a 3d6 is 0.46% (1/216), and in 12 rolls that chance increases to 5.42%.

The probability to roll an 18 on a 4d6k3 is 1.85% (24/1296), and in 6 rolls that chance increases to 10.61%.

By similar math, I get the probability to get at least one 17 result from 12 sets of 3d6 as 15.45%, and for 6 sets of 4d6k3 as 24.75%.

In summary, when building a character where you especially want to get one very strong stat, roll 4d6 to improve your odds.

\$\endgroup\$
15
\$\begingroup\$

I've posted a nicely formatted PDF of this answer that you can read/print/download over at http://www.scribd.com/doc/37700790

When you roll 4d6k3, each of your 6 ability scores follows the exact same probability distribution. In statistics lingo, your 6 ability scores are i.i.d.(1) random variables.
Call one of these i.i.d. random variables \$Y\$, it has the following characteristics:

  • The mean of \$Y\$ is \$E[Y]=12.2446\$
  • Its standard deviation is \$\sigma_Y = 2.8468 \$
  • Its distribution is skewed to the left with skewness of \$-0.2835\$

By comparison, when you roll 3d6 once, you get a random variable \$X\$, with the following characteristics:

  • The mean of \$X\$ is \$E[X]=10.5\$
  • Its standard deviation is \$\sigma_X =2.9580\$
  • Its distribution is symmetric, so its skewness is \$0\$

However, when you roll 3d6 12 times and keep the highest 6, you get 6 different random variables (not i.i.d.), called the 7th through 12th order statistics, denoted \$X_{(7)},\dots,X_{(12)}\$. For example, X(12) is the maximum of the 12 rolls. Each order statistic has its own mean, standard deviation, and skewness:

\begin{array}{l|rrr} & \text{mean} & \text{standard deviation} & \text{skewness} \\ \text{Order statistic} & E[X_{(i)}] & \sigma_{X_{(i)}} \\ \hline X_{(7)} & 10.8184 & 1.1411 & -0.0056 \\ X_{(8)} & 11.4663 & 1.1487 & -0.0098 \\ X_{(9)} & 12.1517 & 1.1693 & 0.0071 \\ X_{(10)} & 12.9190 & 1.2154 & 0.0436 \\ X_{(11)} & 13.8598 & 1.3046 & 0.0503 \\ X_{(12)} & 15.2263 & 1.4460 & -0.1251 \end{array}

Of course, you can easily find the average of the means of the 7th through 12th order statistics:

$$ \mu = \dfrac{\sum^{12}_{i=7} E[X_{(i)}]}{6} = 12.7403 $$

So \$\mu > E[Y]\$ by about a ½ point. But note that \$E[X_{(7)}] > E[X_{(8)}] > E[X_{(9)}] > E[Y]\$ meaning the expected value of each of the 6 ability scores generated with 4d6k3 is greater than what you can expect from half the ability scores generated by the largest 6 of 12x(3d6).
So the answer isn't so simple.


(1). "i.i.d. random variables" stands for "independent and identically distributed random variables".

\$\endgroup\$
4
  • \$\begingroup\$ Could you please explain how did you calculate E[Y]? \$\endgroup\$
    – raven
    Commented Sep 19, 2010 at 11:18
  • 2
    \$\begingroup\$ @Jaime Pardos: There is a general, combinatoric formula for calculating the probability mass function f(y)=Pr[Y=y] for the random variable Y that results from throwing n s-sided dice and summing the highest k dice. The formula was derived by a user calling himself ``techmologist'' on Physics Forums at physicsforums.com/showthread.php?p=2813034 Once you know the pmf f(y) of Y, you can easily calculate its expected value E[Y]=mu=sum of f(y)*y over all possible values of y. Also, you can calculate its variance sigma^2=E[(Y-mu)^2]=sum of f(y)*(y-mu)^2 over all possible values of y. \$\endgroup\$
    – A. N. Other
    Commented Sep 19, 2010 at 17:26
  • 2
    \$\begingroup\$ The doc over on scribd is great (if a bit mathematically dense), but can you find a way to present it better here? StackExchange doesn't understand LaTeX. \$\endgroup\$ Commented May 30, 2014 at 18:05
  • \$\begingroup\$ @PaulMarshall Challenge accepted! ;-) \$\endgroup\$
    – G0BLiN
    Commented Oct 22, 2014 at 16:45
14
\$\begingroup\$

I simulated a million stat arrays with each method. I sorted each array, then took the average. Here's what I got:

with 3d6×12 method :    10.8  11.5  12.2  12.9  13.9  15.2 
with 4d6 method    :     8.5  10.4  11.8  13.0  14.2  15.7

So, with the 3d6×12 method, your best stat will be on average 15.2. With the 4d6 method it will be on average 15.7.

Conclusion: with the 4d6 method, your best (and second-best and third-best) stats will be higher, but your remaining stats will be dramatically lower.

\$\endgroup\$
1
  • 3
    \$\begingroup\$ Thanks to James for unearthing this thread, and for having the idea that your highest roll is more important than the others. \$\endgroup\$
    – Dan B
    Commented Apr 6, 2016 at 20:13
6
\$\begingroup\$

As everyone else has stated, 12 rolls of 3d6 is better.

You guys writing hundreds of lines of dice code... I love the web-based tool for Troll for dice calculations.

Here's Troll code for best six of 12 rolls of 3d6:

sum (largest 6 12#(sum 3d6))

This averages in a total score around 76.4.

And the Troll code for six rolls of 4d6 keeping the best 3d6:

sum 6#(sum largest 3 4#d6)

This averages in a total score around 73.5.

\$\endgroup\$
4
  • 11
    \$\begingroup\$ But writing code is so much fun! \$\endgroup\$ Commented Aug 31, 2010 at 9:36
  • 7
    \$\begingroup\$ Writing short and concise code that does exactly the same thing is much more fun. ;) \$\endgroup\$
    – Adam Dray
    Commented Aug 31, 2010 at 18:56
  • 9
    \$\begingroup\$ But these are strict averages! We want to know the standard deviation, because some stats can be bad, and that's okay, and we want to know if min-maxing is an option! This is crucial! Really! I should be typing in all caps! \$\endgroup\$
    – Beska
    Commented Sep 20, 2010 at 20:13
  • \$\begingroup\$ Last I checked, the web-based Troll tool is producing an error when you run it in statistics mode. If you really want this statistics info, I can (or you can) run the one-line programs through the command-line tool on your own machine. It'll have to wait till I have some time. \$\endgroup\$
    – Adam Dray
    Commented Sep 20, 2010 at 20:28
3
\$\begingroup\$

Writing a program to brute force it looks like that the difference is slight

I added up all six attributes and counted the number of times that total appears.

The 3d6 six times method clusters around a total of 72, The 4d6 drop low clusters around a total of 74

A straight 3d6 roll clusters around a total of 63.

3d6 six time is more tightly clustered and ranges from 56 to 95 while 4d6 drop low ranges from 40 to 100.

Here is the source code for Visual Basic

Option Explicit
Dim Result1(1 To 18 * 6) As Long
Dim Result2(1 To 18 * 6) As Long
Dim Result3(1 To 18 * 6) As Long

Private Sub Command1_Click()
    Dim I As Long
    Dim R1 As Long
    Dim R2 As Long
    Dim R3 As Long
    Cls
    For I = 1 To 100000
        R1 = RollStat6TimesTakeBest
        R2 = RollStat4
        R3 = RollStat
        Result1(R1) = Result1(R1) + 1
        Result2(R2) = Result2(R2) + 1
        Result3(R3) = Result3(R3) + 1
    Next I

    Dim F As FileSystemObject
    Set F = New FileSystemObject
    Dim T As TextStream
    Set T = F.CreateTextFile("C:\test.csv", True)
    T.WriteLine "Total,3d6 6 times , 4d6 drop one , straight 3d6"
    For I = 1 To 18 * 6
        T.WriteLine CStr(I) & "," & CStr(Result1(I)) & "," & CStr(Result2(I)) & "," & CStr(Result3(I))
    Next I
    T.Close
    MsgBox "Done"
End Sub

Private Function D(Roll As Integer) As Integer
    Dim Result As Long
    Dim Test As Double
    Result = Rnd * 1000000000
    D = Result Mod Roll + 1
End Function

Private Function Roll3D6() As Integer
    Roll3D6 = D(6) + D(6) + D(6)
End Function

Private Function RollStat() As Integer
    Dim Total As Integer
    Dim I As Long
    For I = 1 To 6
        Total = Total + Roll3D6
    Next I
    RollStat = Total
End Function

Private Function RollStat6TimesTakeBest() As Integer
    Dim Best As Integer
    Dim I As Long
    Dim Roll(1 To 6) As Integer
    For I = 1 To 6
        Roll(I) = RollStat
    Next I
    Best = Roll(1)
    For I = 2 To 6
        If Best < Roll(I) Then Best = Roll(I)
    Next I
    RollStat6TimesTakeBest = Best
End Function



Private Function Roll4D6DropLow() As Integer
    Dim Roll(1 To 4) As Integer
    Dim Low As Integer
    Dim I As Integer
    Dim Total As Integer
    Roll(1) = D(6)
    Roll(2) = D(6)
    Roll(3) = D(6)
    Roll(4) = D(6)
    Low = 1
    For I = 2 To 4
        If Roll(I) < Roll(Low) Then Low = I
    Next I
    For I = 1 To 4
        If I <> Low Then Total = Total + Roll(I)
    Next I
    Roll4D6DropLow = Total
End Function

Private Function RollStat4() As Integer
    Dim Total As Integer
    Dim I As Long
    For I = 1 To 6
        Total = Total + Roll4D6DropLow
    Next I
    RollStat4 = Total
End Function
\$\endgroup\$
1
  • 1
    \$\begingroup\$ 3d6 is thrown 12 times, and the best 6 results are kept. \$\endgroup\$ Commented Aug 27, 2010 at 20:37
1
\$\begingroup\$

D&D players are quick on the math. Agreed.

Want a lot of 14-16, go with 4d6. If you want more 17 & 18 go with the 3d6 method. So are you building a Monk or a Wizard?

\$\endgroup\$
3
  • \$\begingroup\$ Why does 3d6 produce more 17&18s than 4d6 DL? \$\endgroup\$ Commented Dec 28, 2011 at 22:28
  • 1
    \$\begingroup\$ @Pureferret Likely because you get more rolls/tries, and that increases the probability. \$\endgroup\$ Commented Mar 15, 2012 at 16:47
  • \$\begingroup\$ You've got the conclusion backwards, from the calculations in other answers \$\endgroup\$
    – Caleth
    Commented Sep 30, 2023 at 14:47

You must log in to answer this question.

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