Finally, I get to a post about mechanics…
I mentioned last time that d20 is a really swingy mechanic. By “swingy”, I mean that the dice rolls feel subjectively like they are all or nothing. Either the attack hits, potentially triggering an effect or even getting a crit, or it misses completely. My proposal is that swingy mechanics are disproportionately frustrating because they introduce excessive randomness in the plan-play feedback loop. Some randomness is fun, but 1d20 combined with an additional damage roll introduces too much opportunity to destroy the best-laid plans of both PCs and Game Masters.
The distribution of a d20 is uniform (Wikipedia’s stats entries are largely worthless to non-mathematicians, taking simple concepts and obfuscating them in academic jargon). This simply means there is an equal probability that the die will land on any number, 1-20. To turn this uniform distribution into a weighted probability, we assign a target number to hit. The more numbers that fall within the target, the greater a chance to hit. The baseline is generally 10 for Player Characters. This means that for any given roll, there is a 55% chance of success.
This is a nice, straight-forward mechanic that has worked fine for generations of gamers. Over a long enough timeframe, it provides the right proportion of successes to failures. Unfortunately, this timeframe is often longer than a single encounter – and sometimes longer than a single gaming session. If a group manages to get two 10-round encounters in, assuming one to-hit roll per round, a player can easily have a string of good or bad luck that’s outside the desired probability of about 55%. This is why Perico and others discuss accuracy as one of the most abused mechanics in D&D. Missing sucks, and virtually all powers (and player agency) are gated by this single roll. So, players naturally optimize around it.
An alternative, suggested by a friend in my gaming group, is to simply roll 2d10 and add them instead of 1d20. Two 10-sided dice added together creates a normal distribution from 2-20. This means there’s a higher probability of rolling a number near the middle than at either extreme. This is because there are multiple combinations that add up to 10 (1 and 9, 2 and 8, 3 and 7, etc.) and only one that adds up to the extremes of 2 and 20 (1 and 1, 10 and 10). The probability of rolling either of these is only 1% (whereas 20 shows up 5% of the time on a d20). If we keep the target number at 10, will simply changing from 1d20 to 2d10 help reduce the chances of a string of swinginess? I ran a simulation using Excel and a few thousand RANDBETWEEN() functions:

This table shows the number of times each result was rolled over 10 rolls. The X axis is the die roll result and the Y axis is the number of times that result came up. You can see the uniform distribution for 1d20 and the normal distribution 2d10 (2d10 results are clustered around the middle). If we compare hits and misses vs. a target of 10, we get:

Half of the 1d20 rolls hit and 70% of the 2d10 rolls hit. Already things seem a little less swingy. But, I ran this simulation a dozen times and this pattern didn’t always hold. It was still easy to get strings of good and bad luck, but in general 2d10 yielded more consistent results than 1d20. Ultimately, we know that the probability of a 10 or higher roll on 2d10 is about 2.5% higher than on a 1d20 (and the longer simulations below bear this out). But, what we’re trying to determine isn’t the effect over the long term. We want to understand the impact on the play experience of a single session.
Let’s look at the effect this will have on damage. Hitting more consistently will result in higher damage over time. For this simulation, I used a weapon that does 1-12 damage. I used an average damage of 6.5 instead of the RANDBETWEEN() function since damage rolls introduce another layer of swinginess. I created number series both without crits on a 20 (6.5 damage) and with crits on a 20 (18 damage to simulate max damage plus some amount of extra dice). This created the following trend:

Crits make a big difference in the damage output of 1d20. Without them, 1d20 can’t keep pace in a single combat with the reliability of 2d10. What’s also notable about this is that long, flat lines indicate a string of misses. In this example, the PC would miss consistently for three rounds in a row (rounds 4-6) on the d20. While the ending damage is relatively close, 2d10 would be less frustrating because the player got to contribute something every round (not to mention triggering on-hit effects). We’ll need more data points to see how this works out over time. Let’s run the same simulations over 25 rounds (3-5 battles).

Differences between the shapes of the distributions are becoming more obvious.

2d10 is hitting more consistently.

2d10 and 1d20 are neck and neck in damage. 1d20 tends toward chains of misses and jumping ahead due to a crit, whereas 2d10 provides more consistent damage. This cycle – lots of misses balanced by highly-effective hits – is the essence of swinginess. Finally, it gets more interesting when we look at results over the long haul. Here’s the simulation over 100 rounds, or about 10-15 battles:

Here the bell curve is obvious. But, look at all those crits with 1d20 (not to mention all the ones)!

As expected, the gap between 1d20 and 2d10 has narrowed over time – though 2d10 is still slightly ahead.

1d20 has pulled into the lead for damage with all those crits. In an earlier version of this post I set the crit value at 12 instead of 18. It turns out this is an important dial to turn in keeping damage balanced between the two methods.
As I mentioned earlier, these long-term results aren’t really what we’re curious about (though they help us understand the long-term effects of our short-term optimizations). We’re still not really “capturing the fun”. My intuition tells me that missing sucks and hitting rules. Every miss detracts a bit, and every hit adds something. Crits add a lot. So, what if we produce a “Cumulative Fun” model that subtracts one for each miss, adds one for each hit, and adds three for each crit (does a crit make up for three misses? Seems about right). Here’s how that cumulative fun comparison looks over progressively larger sets of rolls.

We finish the battle at same level of fun.

A string of misses starts to drag down 1d20.

1d20 is bouncing along the bottom.

Like the stock market, a downturn can really effect your future earnings. 2d10 clearly pulls ahead in the long run. If we take our assumptions to be true – a failure is about as frustrating as a success is fun and a crit is about three times as fun as a regular success – then over time, rolling 2d10 clearly trends toward more fun than 1d20. (I suspect the negative impact of a miss is actually higher than this, but I’ll save that for another post). For a single session, the more swingy our mechanic, the more rolls per encounter we need to balance it out. A swingy mechanic and slow fights leads to considerably less fun. To get the mechanical feedback we’re looking for, we need to make more rolls per battle and normalize the distribution of results.
This analysis just scratches the surface and doesn’t take balancing into account. WotC has moderated some of the frustration of misses using mechanics like on-miss effects and the reliable mechanic. There are also implications like the effect of a +1 – each plus is much more powerful with a normal distribution than with a uniform distribution because of the size of the standard deviations – especially around the middle numbers. What are the long-term effects of only critting 1% of the time instead of 5%? Some players might really miss this (and it limits the design space for crits – though some folks think that’s a really good idea). Can we apply this rule selectively? Since 2d10 grants such a different feel than 1d20, maybe it can be selectively applied to particular classes or powers – much the way some weapons use 1d12 and others use 2d6. This breaks the D&D unified mechanic; but, as we discussed in an earlier post, breaking with the past is exactly what we’re trying to do.
Here’s my Excel spreadsheet if you want to mess around with it: Swinginess_and_Frustration-1d20_vs_2d20