You’ve made me happy. :)

]]>2 0.903 0.950 0.998

so u say that i have 95% of rolling above or equal with d2 without advantage? lets see…

1 – 1

1 – 2

2 – 1

2 – 2

for me this is only 75% chances so u made a fatal mistake in ur calculations. sorry.

]]>Advantage: P(a or b) = P(a) + P(b) – P(a) x P(b)

Disadvantage: P(a and b) = P(a) x P(b)

Since P(a) = P(b), this becomes:

Advantage: P(a or b) = 2 x P(a) – P(a)^2

Disadvantage: P(a or b) = P(a)^2

In game turns, the chance of getting a roll equal to AC or above becomes:

Normal: (21-AC)/20

Advantage: (42 – 2AC) / 20 – ((21 – AC)/20)^2 = (21 – AC) x (AC + 19) / 400

Disadvantage: (21 – AC)^2 / 400

To calculate the chance of hitting an enemy, simple take their AC, adjust with modifiers (e.g. if you have +5 to hit, lower AC by 5), and input into the relevant equation. No tables or simulations needed.

]]>This is assuming that all attacks are equal; if the attack with advantage has higher damage, or stronger riders, than the two attacks without, that changes the maths.

]]>prob(hitting normally) = p

Expected damage from two attacks is p.d + p.d = 2.d.p

Expected damage from one advantaged attack = d.p* … p* being the greater probability of hitting with advantage.

From the table above, p* is never going to be larger than (p + 0.25) and by adding a ‘2p’ column to the table above you can see that 2p is uniformly greater than p*.

From 20 down to 1, 2p is greater by: 0.2%, 1%, 2.2%, 4%, 6.2%, 9%, 12.2%, …

]]>Would it be statistically better to roll a single d20 and adding/subtracting a rolled d6? I know the potential for a higher total is there, but does that offer a flatter affect over a single d20 roll? The second d20 increases the possibility of a pass at the lower targets than at the higher targets, and is inverse for disadvantage. I would think that you would want the same relative boost/penalty throughout the range of possible targets and rolls.

]]>gg <- ggplot(dat.m, aes(x=Result, y=Prob, group=Type, color=Type))

gg <- gg + geom_line() + geom_point()

gg <- gg + labs(title="D&D 5e Advantage and Disadvantage Rolls")

gg <- gg + theme_bw()

gg <- gg + theme(legend.position=c(0.1, 0.2))

gg

Here is an example, examining the probabilities for advantage and disadvantage as discussed in the article. Note that a line of J code executes from right to left.

The probability of rolling any given number from 1 to 20 on a fair 20-sided die is 1 in 20, or 1/20. There is only one way to roll at or above a 20, which is by rolling 20 itself. So the chance of that is 1/20. To roll at or above 19, we can roll 19 or 20, so the chance is 1/20 + 1/20 or 2/20. To roll at or above 18, we can roll 18, 19, or 20, so the probability is 3/20, and so on. In J we can get the probability for rolling at or above each number on a straight d20 roll from:

straight =. (>: i. 20) % 20

where i. 20 generates the integers from 0 to 19, >: increments each of these by 1 to give 1 to 20, % is the division symbol (because / is used for something else), and =. assigns a value to a variable. The result (which we can get just by typing the name of the variable) is:

0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1

where 0.05 = 1/20.

Now suppose we are rolling with disadvantage. To get a score at or above a given number we must roll that number or higher on the first die AND on the second die. To “and” two probabilities we multiply them. So the probabilities of rolling at or above 20, 19, 28, …, 1 with disadvantage are:

disadvantage =. straight * straight

which gives us:

0.0025 0.01 0.0225 0.04 0.0625 0.09 0.1225 0.16 0.2025 0.25 0.3025 0.36 0.4225 0.49 0.5625 0.64 0.7225 0.81 0.9025 1

If we roll with advantage, we just have to roll at or above the desired number with either the first die OR the second die. To get this probability we first add the probability of rolling the desired number or above on either die, but then we must subtract the probability of rolling at or above that number on BOTH dice so we don’t count that probability twice. So we get:

advantage =. (straight + straight) – straight * straight

or

advantage =. (straight + straight) – disadvantage

which gives us:

0.0975 0.19 0.2775 0.36 0.4375 0.51 0.5775 0.64 0.6975 0.75 0.7975 0.84 0.8775 0.91 0.9375 0.96 0.9775 0.99 0.9975 1

We can assemble the results into a table easily enough. To generate a list of the target number for each probability, we generate the numbers from 1 to 20 and reverse them using |. like so:

|. >: i. 20

to get:

20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

We then combine all of our results with stitch (,.), using format (“:) to give us the desired number of decimal places:

2 6j3 6j3 6j3 “: (|. >: i. 20),.disadvantage,.straight,.advantage

(6j3 is the complex number 6 + 3i; for format the real part of the number is the field width, the complex part is the number of decimal places) and get:

20 0.003 0.050 0.098

19 0.010 0.100 0.190

18 0.022 0.150 0.277

17 0.040 0.200 0.360

16 0.062 0.250 0.438

15 0.090 0.300 0.510

14 0.122 0.350 0.578

13 0.160 0.400 0.640

12 0.203 0.450 0.698

11 0.250 0.500 0.750

10 0.303 0.550 0.798

9 0.360 0.600 0.840

8 0.423 0.650 0.877

7 0.490 0.700 0.910

6 0.562 0.750 0.938

5 0.640 0.800 0.960

4 0.722 0.850 0.978

3 0.810 0.900 0.990

2 0.902 0.950 0.997

1 1.000 1.000 1.000

It’s easy enough to plot the results. We first have to load the graph plotting package:

require ‘plot’

We can then generate the plot above:

plot (|. >: i. 20);disadvantage,straight,:advantage

We could also add a key and axis captions easily, though this makes the line of code much longer:

‘key Disadvantage Straight Advantage; keypos left bottom; ycaption Probability; xcaption Roll at or above’ plot (|. >: i. 20);disadvantage,straight,:advantage

or we could generate the “stegasaurus” bar plot in the referenced article:

‘bar; ycaption Probability bonus; xcaption Roll at or above’ plot advantage – straight

J has many other features that are very useful for statistical analysis, including least squares curve fitting.

]]>Personally I loathe the uniform distributions of D&D, and I htink they model a really weird world, but they are at least intuitively understandable, and it’s easy to incorporate situational modifiers (and to design your own monsters). This, on the other hand, will make things harder for GMs without getting rid of the basic problems inherent in resolving challenges using uniform distributions.

Of course, it could be worse. The Japanese game *Double Cross* uses a system of dice pools with exploding summed maxima and modifiable explosion thresholds that produces insane probability distributions. Even the most experienced statisticians would have difficulty GMing that system …

In the case of the max of two i.i.d. draws from a Uniform(1,K), there’s an analytic solution that’ll work even when K is large. Of course, even K=1000 is easy to enumerate fully.

]]>disadvantage <- unlist(outer(1:20,1:20, function(x,y) ifelse(x<y,x,y)))

advantage y,x,y)))

]]>disadvantage <- unlist(outer(1:20,1:20, function(x,y) ifelse(x<y,x,y)))

advantage y,x,y)))

On the other hand, there’s really nothing you can do like advantage if it’s just a single roll other than choose the bonus or difficulty class accordingly.

In the end, D&D is fantasy simulation, not physics simulation. So you just might want to give those Cossacks a fighting chance.

The DMs I play with, myself included, do all sorts of on-the-fly compensation by determining how many ability checks are going to be required to succeed in some task. Instead of just one roll with disadvantage to climb a slippery wall, you might have to make two or more rolls. If either goes wrong, you typically can get a save to recover. So it’s all sorts of nonlinear in play.

For example, I have a weekly game where a friend of mine runs a steampunk fantasy game set in the Napoleonic era. It’s been house-ruled for the last 35 years, starting with the rules from Bushido and Traveler. Here’s how the equivalent of a D&D skill challenge went just last week. The setting is an old dwarven limestone cave in a haunted valley outside of Acre, Egypt, where we’re helping the French army and aeronautical corps scout transport routes for the siege. My Maltese dwarven military engineer had just belayed his necromancer friend’s safety rope, when the necromancer sets out across a narrow ledge over a crevasse and fails his climb roll, starts slipping as the limestone underfoot crumbles away, grabs Wile E Coyote style for a purchase, but fails his save to stabilize himself. He then plunges to the end of the dwarf’s rope, which luckily holds taut. The necromancer is now dangling cave monster bait, and as the dwarf fails his strength roll to pull the struggling necromancer up and the necromancer fails his roll to scrabble up the sheer wall of the crevasse, a giant millipede obligingly snatches him off the end of his rope, leaving the dwarf with a frayed rope end. It’s the dwarf’s last rope, and he’s going to have to free climb down to the millipede’s lair …

]]>I see the beauty of physically rolling dice. But it seems to come at the expense of very constrained notion of advantage.

]]>(j/k Bob)

]]>