25
\$\begingroup\$

I roll a d20.

If I have a choice between d20+x with advantage, or d20+y without advantage, what choice do I make to maximise the result? What are the values of x and y where the choice changes (if it changes at all)?

Assume x < y.

\$\endgroup\$
1

5 Answers 5

35
\$\begingroup\$

Theory

The first thing we'll look at is a table that represents the odds of rolling at least a given DC, given a d20 with or without advantage (no modifiers yet).

Natural DC Advantage No Advantage Difference Eq. Flat Modifier
DC 1- 100.000% 100.000% 0.000% 0
DC 2 99.750% 95.000% 4.750% 0.95 (1)
DC 3 99.000% 90.000% 9.000% 1.8 (2)
DC 4 97.750% 85.000% 12.750% 2.55 (3)
DC 5 96.000% 80.000% 16.000% 3.2 (4)
DC 6 93.750% 75.000% 18.750% 3.75 (4)
DC 7 91.000% 70.000% 21.000% 4.2 (5)
DC 8 87.750% 65.000% 22.750% 4.55 (5)
DC 9 84.000% 60.000% 24.000% 4.8 (5)
DC 10 79.750% 55.000% 24.750% 4.95 (5)
DC 11 75.000% 50.000% 25.000% 5
DC 12 69.750% 45.000% 24.750% 4.95 (5)
DC 13 64.000% 40.000% 24.000% 4.8 (5)
DC 14 57.750% 35.000% 22.750% 4.55 (5)
DC 15 51.000% 30.000% 21.000% 4.2 (5)
DC 16 43.750% 25.000% 18.750% 3.75 (4)
DC 17 36.000% 20.000% 16.000% 3.2 (4)
DC 18 27.750% 15.000% 12.750% 2.55 (3)
DC 19 19.000% 10.000% 9.000% 1.8 (2)
DC 20 9.750% 5.000% 4.750% 0.95 (1)
DC 21+ 0.000% 0.000% 0.000% 0

A +1 to a non-advantage roll will always improve the odds of rolling a given number by exactly 5 percentage points. Conversely, a +1 to an Advantage roll will increase your odds by an amount equal to moving up one row on that table: a DC7 check made with +1 is equivalent to a DC6 check made with +0. A DC20 check made with advantage and a +1 modifier is equivalent to a DC19 check made with +0, which constitutes a 9.250 percentage point improvement.

There are a few casual observations we can make:

  • It's not possible to roll a natural d20 lower than a 1, so if the advantage check requires a natural 1, then there's no benefit to gaining any modifier (or advantage, for that matter): it's a check that is impossible to fail.
  • At DC 2, gaining advantage increases the odds of success by 4.750% (to 99.750%) but gaining a +1 modifier increases the odds of success by 5% (to 100%). So intuitively, If we're comparing 1d20+x/ADV vs 1d20+x+1/NoADV, and the natural number we need to hit is a 2 (for the advantage check), then the +1 modifier is better.
  • It's the same deal at DC20: Gaining Advantage will improve from 5% to 9.750%, but gaining +1 will improve from 5% to 10%. Again, the +1 modifier is better.
  • But the differences get more drastic as we move closer to the mean of the roll: At DC3, advantage improves the odds by 9% (90%→99%) but a +1 modifier only improves the odds by 5% (90%→95%), so here, Advantage is better than a +1 modifier; but it's NOT better than a +2 modifier (90%→100%).
  • In the table, I've added the "Eq. Flat Modifier" column: this describes, for each row, how much of a modifier you would need for the benefit from that modifier to be equivalent to the benefit provided by Advantage. Since 5e doesn't have "half" modifiers or fractional DCs, I've included the (rounded up) proper modifier in parenthesis next to it. In each row, if the modifier difference between the Advantage and Non-Advantage rolls is greater than that number, then the modifier is better; if it's not, then the Advantage roll is better.

Practice

So back to the original question: Given two rolls, 1d20+x/Adv, and 1d20+y/NoAdv, which is better? Well, as established, it depends on the DC of the check, but to get the results from this table:

  • Calculate the difference between y and x
  • Subtract x (the modifier for the Advantage roll) from the DC to get the "Natural DC"
  • Look at the Eq. Flat Modifier for that row in the table
  • If the difference between y and x is greater than that value, then you should prefer the 1d20+y/NoAdv roll. If not, then you should prefer the 1d20+x/Adv roll.

Examples

  • DC19, 1d20+5/Adv vs 1d20+7/NoAdv
  • Difference is 7 - 5 == 2
  • DC19 - 5 is DC14
  • DC14 has a Eq. Flat Modifier of 4.55
  • Therefore, the Advantage roll is better than the non-Advantage roll.
  • DC3, 1d20+1/Adv vs 1d20+2/NoAdv
  • Difference is 2 - 1 == 1
  • DC3 - 1 is DC2
  • DC2 has a Eq. Flat Modifier of 0.95
  • Therefore, the non-advantage roll is better than the Advantage roll
  • DC17, 1d20+9/Adv vs 1d20+14/NoAdv
  • We could skip the steps: none of the rows have a Eq. Flat Modifier greater than 5, meaning the +5 modifier will always be better than (or equivalent to) the Advantage improvement. Nonetheless...
  • Difference is 14 - 9 == 5
  • DC17 - 9 is DC8
  • DC8 has a Eq. Flat Modifier of 4.55
  • Therefore, the non-advantage roll is better than the Advantage roll

Attack Rolls

Attack Rolls are a little weird, because you no longer simply care about passing the check; you also care what the natural number was because of Critical Hits and Misses.

Most of the math still checks out: if all you care about is hitting/missing, then the table above can be used, since the scenarios where a Natural 2 hits and a Natural 19 misses are pretty rare in 5e. If, however, you instead care more about the Crits/Auto-Misses, then you should introduce a "subjectivity factor", which you can define however you like: is it important to you that you get a critical hit (or avoid a critical miss)? Then always go Advantage. If not, then use the table above. I generally stick to the table personally, but "clutch factor" is one of those hazy things that can't be objectively defined, so you'll need to make that call for yourself.

\$\endgroup\$
4
  • \$\begingroup\$ If you provide a distribution of DCs you expect to meet plus a factor of "how much do I care if I pass" (basically a weight), you can work out how much advantage is "worth" in flat +X bonus. (With "bounded accuracy", +X is going to be linear) \$\endgroup\$
    – Yakk
    Commented May 9, 2019 at 17:35
  • \$\begingroup\$ Minor nitpick: the last bullet before "Practice" says "In each row, if the modifier difference between the Advantage and Non-Advantage rolls is greater than that number, then the modifier is better; if it's not, then the Advantage roll is better." I think that should be "at least" instead of "greater than". \$\endgroup\$ Commented May 10, 2019 at 9:06
  • \$\begingroup\$ @EagleV_Attnam It's splitting hairs: in the scenario where the difference is exactly equal to the calculated value, neither roll is better (unless you explicitly prefer the Advantage Roll for context-specific reasons). \$\endgroup\$
    – Xirema
    Commented May 10, 2019 at 14:12
  • \$\begingroup\$ @Xirema That's true, I misread "that number" as referring to the adjusted (rounded up) value. \$\endgroup\$ Commented May 10, 2019 at 14:19
20
\$\begingroup\$

It will depend on what you're trying to achieve. For example, if you need to reach DC 25, and \$x = 4\$ and \$y = 5\$, the advantage on the roll with \$x\$ doesn't matter; you'll never roll higher than 24. With the +5, you'll at least have a 5% chance.

Here (scroll down to "Advantage versus Simple Bonuses") is a table which shows which bonus (difference between x and y) corresponds to having advantage or not.

enter image description here

(source: Zero Hit Points)

\$\endgroup\$
5
  • 1
    \$\begingroup\$ In 5e you don't need to "beat" a DC, you need to match it to overcome it. It would be clearer if your first sentence said "If the DC is 25, and x = 4 and y=5 then you will never pass the DC with x = 4, but you have a chance of passing the DC (5%) with y = 5". \$\endgroup\$
    – illustro
    Commented May 9, 2019 at 14:39
  • \$\begingroup\$ @illustro thanks, my experience is limited to 3(.5)E ... \$\endgroup\$
    – Glorfindel
    Commented May 9, 2019 at 14:42
  • 1
    \$\begingroup\$ (and even there you didn't need to beat a DC, but it's been a while ...) \$\endgroup\$
    – Glorfindel
    Commented May 9, 2019 at 14:50
  • \$\begingroup\$ I feel this analysis is improved by MORE ANYDICE. For example, with +2/+5 DC 10 advantage wins, 88% to 80%; but at +2/+5 DC 20, the normal roll is better, with odds of 30% vs. 28%. You can tinker with the variables in the script to investigate the results with different values! \$\endgroup\$
    – Carcer
    Commented May 9, 2019 at 15:41
  • 1
    \$\begingroup\$ @Carcer: Have some more AnyDice. :) \$\endgroup\$ Commented May 9, 2019 at 17:23
18
\$\begingroup\$

If you only care about maximising the expected result, as opposed to your odds of hitting a specific target number (for instance, you might be making a contested roll against someone else, like in a grapple, or otherwise don't know the target number ahead of time) this is a pretty simple comparison. Having advantage on a d20 roll increases the expected result from an average of 10.5 to 13.82 (illustrated by this anydice program); that's a benefit of +3.32.

Therefore, in order for a roll without advantage to have a higher expected result than a roll with advantage, the modifier on the normal roll needs to be four or more points better than the modifier on the advantaged roll. +3 with advantage is worse than +7 normally, and so on.

\$\endgroup\$
6
  • 1
    \$\begingroup\$ This answer is great! And shows me we didn't need actual numbers. +1 \$\endgroup\$
    – NotArch
    Commented May 9, 2019 at 14:59
  • \$\begingroup\$ @NautArch It is the kind of question where additional context does inform how you should compare your options, but both approaches are useful in different circumstances. \$\endgroup\$
    – Carcer
    Commented May 9, 2019 at 15:03
  • 1
    \$\begingroup\$ The difference in expected value between your rolls does not determine your odds of beating someone else's roll. As an example, suppose I roll 0 25% of the time and 20 75% of the time. My expected value is 15. My enemy rolls 19 100% of the time. Their expected value is 19. I beat them 1/4 of the time. Another enemy rolls 2 100% of the time. I beat them 1/4 of the time as well. In one case, my "average" roll was -4 and in the other it was +13 compared to them. \$\endgroup\$
    – Yakk
    Commented May 9, 2019 at 16:12
  • 1
    \$\begingroup\$ @Yakk awkward terminology. It's a comparison of the expected outcomes of your own two different options, not directly against whatever your opposition is. (That said, the question is about 5e D&D, so the distributions you propose are not something you would see in practice.) \$\endgroup\$
    – Carcer
    Commented May 9, 2019 at 16:17
  • \$\begingroup\$ @Yakk rephrased to describe expected results rather than the more ambiguous "beat". Is that more palatable? \$\endgroup\$
    – Carcer
    Commented May 9, 2019 at 16:21
8
\$\begingroup\$

First, subtract \$x\$ both from \$y\$ and from the target number you're rolling against. Then look at this graph:

Screenshot

In the graph, find the position on the horizontal axis that matches the target number (minus \$x\$) that you're trying to meet or exceed, and the colored line that matches the extra bonus \$y-x\$ to the roll without advantage. If that colored line is higher that the curved black line at that position on the horizontal axis, you should choose the higher bonus over advantage.

(Specifically, the various lines in the graph show the probability of meeting or exceeding a given target number with various rolls: the black curved line is for d20 with advantage but no bonus, while the five different colored straight lines on top of it are for d20+1 to d20+5.)


Or, to summarize, you should choose a plain \$+y\$ bonus over advantage \$+x\$ when...

  • \$y = x + 1\$ and the target number is at most \$x+2\$ or at least \$x+20\$;
  • \$y = x + 2\$ and the target number is at most \$x+3\$ or at least \$x+19\$;
  • \$y = x + 3\$ and the target number is at most \$x+4\$ or at least \$x+18\$;
  • \$y = x + 4\$ and the target number is at most \$x+6\$ or at least \$x+16\$; or
  • \$y \ge x + 5\$.

(As noted by Xirema, things can change a little if you're e.g. making an attack roll and care about crits. Rolling with advantage has a 9.75% chance of giving you a natural 20, and only a 0.25% chance of a natural 1, whereas with a normal d20 roll both 1s and 20s show up 5% of the time each. Whether those differences in crit odds are worth trading for a somewhat worse chance to hit depends both on the target DC and on how much you value crits.)

\$\endgroup\$
1
  • \$\begingroup\$ Here is what I think to be a simpler graph OP can plug numbers into. Merely change X:1 to what X you want and the same for Y:2. E.g., you want 5 and 10, X:5 and Y:10. \$\endgroup\$ Commented May 9, 2019 at 18:22
1
\$\begingroup\$

tl;dr- Assuming neither roll is a sure thing, then advantage has better odds if$$ \frac{ \left(\text{DC} - \text{advantage bonus} - 1\right)^2}{\text{DC} - \text{normal bonus} - 1 {\phantom{{}^{2}}}} < 20 \tag{1} \,.$$Here's an online C# script to play with this. Details at the bottom of this answer.


Example

  1. You have to beat a \$\text{DC} = 10 .\$

  2. You have two options:

    • Roll normally with a bonus of \$+5 .\$

    • Roll with advantage and a bonus of \$+1 .\$

  3. Plug this into \$\operatorname{Eq.}{\left(1\right)}\$ to find:$$ \frac{\left(\text{DC} - \text{advantage bonus} - 1\right)^2}{\text{DC} - \text{normal bonus} - 1 {\phantom{{}^{2}}}} ~=~ \frac{\left(10 - 1 - 1\right)^2}{10 - 5 - 1} ~=~ \frac{8^2}{4} ~=~16 ~<~ 20 \,.$$

  4. Since \$16 < 20 ,\$ this inequality is \$\texttt{TRUE} ,\$ and therefore rolling with advantage is better.

  5. By contrast, if the \$\text{DC}\$ were \$17\$ instead of \$10 ,\$ then the inequality would've reduced to$$ \frac{\left(\text{DC} - \text{advantage bonus} - 1\right)^2}{\text{DC} - \text{normal bonus} - 1 {\phantom{{}^{2}}}} ~=~ \frac{\left(17 - 1 - 1\right)^2}{17 - 5 - 1} ~=~ \frac{{15}^2}{11} ~=~ \sim 20.45 ~<~ 20 \,,$$

    and since \$\sim 20.45 < 20\$ is \$\texttt{FALSE} ,\$ this means that the odds aren't better when rolling with advantage. So, in this case, it'd seem better to roll normally with \$+5\$ rather than with \$+1\$ and advantage.


Explanation

First:

  1. If either option is a sure-thing, just do it.

  2. If neither option has a chance, nothing you can do anyway.

So this leaves only the case in which both options have some non-certain possibility.

Then, the odds of failing to beat a DC on a single roll are $$ P_{\text{roll}} ~=~ 5 \, \left(\left[\text{DC}\right] - \left[\text{bonus}\right] - 1\right) \, \% \,, $$and the odds of failing to beat a DC with advantage are$$ P_{\begin{array}{c}\text{roll with} \\[-10px] \text{advantage}\end{array}} ~=~ P_{\text{roll}}^2 ~=~ \left(5 \, \left(\left[\text{DC}\right] - \left[\text{bonus}\right] - 1\right) \, \%\right)^2 ~=~ 0.25 \, \left(\left[\text{DC}\right] - \left[\text{bonus}\right] - 1\right)^2 \, \% \,.$$

So, your odds of failure with advantage are lower when $$ 0.25 \, \left(\left[\text{DC}\right] - \left[\text{bonus}\right]_{\text{advantage}} - 1\right)^2 \, \% ~<~ 5 \, \left(\left[\text{DC}\right] - \left[\text{bonus}\right]_{\text{normal}} - 1\right) \, \% \,,$$ or $$ \frac{ \left(\left[\text{DC}\right] - \left[\text{bonus}\right]_{\text{advantage}} - 1\right)^2 }{ \left[\text{DC}\right] - \left[\text{bonus}\right]_{\text{normal}} - 1 } ~<~ 20 \,. $$

To make that a little more intuitive, let's write it as $$ \frac{ \left(\text{DC} - \text{advantage bonus} - 1\right)^2 }{ \text{DC} - \text{normal bonus} - 1 } ~<~ 20 \,. $$


Notes

  1. The tl;dr advice recommends against rolling with advantage when the odds are the same either way. I chose this convention since it's less work. But, if someone likes to roll, then they might instead roll with advantage if $$ \frac{ \left(\text{DC} - \text{advantage bonus} - 1\right)^2}{\text{DC} - \text{normal bonus} - 1 {\phantom{{}^{2}}}} \le 20 \,.$$

  2. The above logic assumes that the d20-die is fair. If it's not, then I'd guess that rolling without advantage is a bit better than it would normally be because an unfair die would seem to have less variability between rolls. Since most dice probably aren't perfectly fair, a hardcore optimizer might prefer to roll without advantage when$$ \frac{ \left(\text{DC} - \text{advantage bonus} - 1\right)^2}{\text{DC} - \text{normal bonus} - 1 {\phantom{{}^{2}}}} \approx 20 \,.$$

  3. The \$`` 20 "\$ in the inequality is no coincidence; it corresponds to the "20" in "d20". Likewise, the \$`` 1 "\$ corresponds to the minimum die value. So if another sort of die is used, this inequality can be generalized to$$ \frac{ \left(\text{DC} - \text{advantage bonus} - \text{min die value}\right)^2}{\text{DC} - \text{normal bonus} - \text{min die value} {\phantom{{}^{2}}}} ~<~ \text{max die value} - \text{min die value} + 1 \,.$$

  4. The above derivation focused on the probability of failure, rather than the probability of success, because the math would've been a bit uglier for rolling with advantage if we focused on maximizing success (rather than minimizing error). However, if anyone does this same calculation for rolling with disadvantage, the math should be cleaner if you instead derive it by focusing on maximizing success. The reason for this is that advantage/disadvantage requires a second die roll only on failure/success of the first roll.


C# script to play with this

I was going to attach a JavaScript snippet here, but I guess that feature's not on this StackExchange. So, here's a C# script that can be run online.

Notes:

  1. To use it, call Report(dc, bonus_normal, bonus_advantage);, and it'll tell you which is better.

    • Currently, it's pre-loaded to call Report(10, 5, 1); and Report(17, 5, 1); to demonstrate the example given near the top of this answer. This should return:

      For    DC = 10    Bonus (normal) = 5    Bonus (advantage) = 1:
      Your odds are better with the power of ADVANTAGE!
      
      For    DC = 17    Bonus (normal) = 5    Bonus (advantage) = 1:
      Advantage is for losers; roll normally!
      
  2. By default, it uses a d20, with a minimum value of 1 and a maximum value of 20. Both of these values can be changed in the code.

  3. \$\operatorname{Eq.}{\left(1\right)}\$ (and its generalization, as used in this script) assume that, if the odds can't be improved by advantage, you prefer to roll normally (since it's less rolling).

  4. \$\operatorname{Eq.}{\left(1\right)}\$ assumes success and failure are both possible with both advantage and normal rolling. This script checks to ensure that that's true before using \$\operatorname{Eq.}{\left(1\right)} .\$

Source code (C#):

using System;

public class Program
{
    //    A typical d20 has a minimum value of 1 and a maximum of 20:
    public const long MINIMUM_DIE_VALUE = 1;
    public const long MAXIMUM_DIE_VALUE = 20;

    public static void RunExample()
    {
        Report(
                    10
                ,   5
                ,   1
            );

        Report(
                    17
                ,   5
                ,   1
            );
    }

    public static void Report(
                long dc
            ,   long bonus_normal
            ,   long bonus_advantage
        )
    {
        var stringMessage = 
                    "For\tDC = "
                +   dc.ToString()
                +   "\tBonus (normal) = "
                +   bonus_normal.ToString()
                +   "\tBonus (advantage) = "
                +   bonus_advantage.ToString()
                +   ":"
                +   System.Environment.NewLine
            ;

        if (ShouldRollWithAdvantage(
                    dc
                ,   bonus_normal
                ,   bonus_advantage
            ))
        {
            stringMessage += "Your odds are better with the power of ADVANTAGE!";
            //Console.WriteLine("Your odds are better with the power of ADVANTAGE!");
        }
        else
        {
            stringMessage += "Advantage is for losers; roll normally!";
            //Console.WriteLine("Advantage is for losers; roll normally!");
        }

        Console.WriteLine(stringMessage);
        Console.WriteLine();
    }

    public static bool ShouldRollWithAdvantage(
                long dc
            ,   long bonus_normal
            ,   long bonus_advantage
        )
    {
        //    Case 1:
        //        If rolling with advantage can't succeed, then just roll normally.
        //        Doesn't matter if rolling normally can't succeed, either, because if
        //        you're going to fail either way, may as well only roll once.
        if (dc - bonus_advantage > MAXIMUM_DIE_VALUE)
        {
            return false;
        }

        //    Case 2:
        //        If rolling without advantage can't succeed, then roll with advantage.
        if (dc - bonus_normal > MAXIMUM_DIE_VALUE)
        {
            return true;
        }

        //    Case 3:
        //        If rolling without advantage always succeeds, then roll without advantage.
        if (dc - bonus_normal <= MINIMUM_DIE_VALUE)
        {
            return false;
        }

        //    Case 4:
        //        If rolling with advntage always succeeds, then roll with advantage.
        if (dc - bonus_advantage <= MINIMUM_DIE_VALUE)
        {
            return true;
        }

        //    Case 5:
        //        Since rolling with advantage and rolling without advantage are both
        //        possible-but-not-guaranteed, we compare their odds of success.
        //        
        //        This method checks if
        //            (DC - bonus_advantage - 1)^2
        //        is less than
        //            20 * (DC - bonus_normal - 1)
        //        instead of the fraction to avoid floating-point values.
        {
            var leftHandSide = (dc - bonus_advantage - MINIMUM_DIE_VALUE);
            leftHandSide *= leftHandSide;

            var rightHandSide = (MAXIMUM_DIE_VALUE - MINIMUM_DIE_VALUE + 1) * (dc - bonus_normal - MINIMUM_DIE_VALUE);

            var shouldRollWithAdvantage = leftHandSide < rightHandSide;

            return shouldRollWithAdvantage;
        }
    }

    private static bool TryValidateProgramConstants(
                out string errorMessage
        )
    {
        if (!(MINIMUM_DIE_VALUE < MAXIMUM_DIE_VALUE))
        {
            errorMessage = "Maximum die value must be greater than minimum die value.";
            return false;
        }

        if (MINIMUM_DIE_VALUE < -1000)
        {
            errorMessage = "Unreasonably low minimum die value.";
            return false;
        }

        if (MAXIMUM_DIE_VALUE > 1000)
        {
            errorMessage = "Unreasonably high maximum die value.";
            return false;
        }

        errorMessage = default(string);
        return true;
    }

    public static void Main()
    {
        string errorMessage;
        if (TryValidateProgramConstants(out errorMessage))
        {
            RunExample();
        }
        else
        {
            Console.WriteLine("Error in program validation; aborting run.");

            if (!string.IsNullOrWhiteSpace(errorMessage))
            {
                Console.WriteLine(errorMessage);
            }
        }

    }
}
\$\endgroup\$
1

You must log in to answer this question.

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