Overview

I’ve been a fan of Dungeons and Dragons since 2nd Edition. While that doesn’t put me in the highest echelon of old timers it’s worthy of a fairly decent amount of hipster cred.

Things have changed a lot in the three full editions since then. One thing that hasn’t changed are the basic stats of your character. (Well, not much. 18/00 STR for life)

The standard method for rolling stats is to take the results from four ‘d6’ (six sided dice), dropping the lowest number and adding up the rest. The higher the number the better as it provides the character with more power.

Players can then choose where to put their results based on what type of character they want to make.

This project is something that I built on from the book Python Crash Course which introduced me to the basic concepts I used.

The most significant expansion I did was the rolling of a full set of character attributes and comparing them to a baseline set out by the 5th Edition Player’s Handbook. (If players don’t want to risk rolling randomly they can take a default set of scores: 15, 14, 13, 12, 10, 8)

Project

AD&D Player Handbook Character Stat creation analysis

What I Did

Used Python (w/ pygal and matplotlib) to simulate a large number of Dungeons and Dragons character creations using the 4d6 and drop lowest method from the Player’s Handbook

Average Result of rolling 4d6 and dropping lowest result

The project in Python Crash Course stopped at showing the distribution of results from rolling a set of dice a large number of times. I set it to do the PHB attribute rolling scheme which produced this graph.

It’s plain to see that many of the numbers offered in the default set are ones that are rolled the most often. Though some considerations are made to game balance, choosing 10 instead of 11 for example.

‘Over Default’ = Total attributes are greater than Default Set

‘Exactly Default’ = Total attributes equal the Default Set

‘Under Default’ = Total attributes are less than the Default Set

(Default Set = 15, 14, 13, 12, 10, 8 = 72)

Relative strength calculation: The difference between the number of attributes outside the default set determines ‘relative strength’

Very strong characters have at least two more attributes higher than 15 than they have attributes lower than 8. (Example: 17, 16, 14, 12, 10, 8)

Strong characters have a net positive of one strong attribute. (Example: 18, 16, 14, 12, 10, 7)

Regular characters have a net attribute strength of zero and weak and very weak are the mirror of the strong categories.

Comparing randomly generated character attributes to default set.

Over Default = 55.9%

Very Strong = 14%

Strong = 23.97%

Regular = 16.78%

Weak = 1.15%

Very Weak = 0%

Exactly Default = 5.52%

Very Strong = .16%

Strong = 1.65%

Regular = 3.22%

Weak = .49%

Very Weak = 0%

Under Default = 38.58%

Very Strong = .12%

Strong = 4.53%

Regular = 19.3%

Weak = 12.21%

Very Weak = 2.42%

Conclusions and Improvements

A clear majority of rolls will end up with a greater pool of stat points than taking the default values and nearly 45% of all characters rolled this way will be strong characters, having at least one more attribute that is higher than the default maximum than they do ones that are below the default minimum.

However, taking the default prevents the ~38% of rolling a character with lower stats than the default. Plus there is over a 16% chance of rolling a character with more weak attributes than not.

So this shows there is a decent amount of risk vs. reward in rolling the attributes yourself rather than taking the default. Also, weak scores can be mitigated through other choices or put into areas that are not necessary for the character’s given class. (Not many warriors need a high amount of INT, for example)

This could also lead to interesting role-playing opportunities.

Conclusion: Roll your stats and if you end up with truly horrible numbers beg your DM for a do-over.

Improvements: Obviously there are problems inherent with the simplistic randomness generator used. Improving that is a little beyond the scope of my current skill level though.

I would like to fix the “strength” determination however as simply adding a point for an attribute over 15 and subtracting one for a value less than 8 is not a precise method of measuring character strength.

For example an attribute set of 18, 18, 18, 3, 3, 3 would rate as a ‘regular’ character but would present significant game-play challenges.

In the future I would like to figure out a way to gauge strength based on the roll modifier of any given attribute score. Perhaps even with consideration taken for various bonuses and specific class needs.

But that will take a lot more work. This project is intended as my first step into the realm of proper data science. I’m not trying to prove anything definitive here. I hope to use this as a benchmark to gauge my progress on this path.

Like an artist who goes back to a drawing they did when they were young I would like to revisit this concept in the future to see how I’ve improved.

Leave a Reply