It generally favors the attacker, with exceptions
This isn't a terribly surprising result: the average outcome of 1d20 + bonus is literally equal to 10.5 + bonus, which is 0.5 points greater than 10 + bonus, resulting in a 2.5% point improvement in overall odds (assuming equal bonuses).
To verify, I wrote a quick program to calculate the odds of an attacker beating a defender, when they both have the same bonus, using active odds (both roll a d20) and passive odds (attacker rolls d20, defender takes 10). As expected, the odds for actively rolled dice are about 2.5% fewer for the attacker than the passively rolled dice:
//You'd naturally expect all the odds to be better than 50%, since the attacker wins ties
//Equal Bonuses:
Active Results: 5250737 out of 10000000 (52.507369999999995%)
Passive Results: 5498955 out of 10000000 (54.98955%)
//Repeated the trial several times to show accuracy: results are all within 0.04% of each other
Active Results: 5248819 out of 10000000 (52.48819%)
Passive Results: 5498203 out of 10000000 (54.98203%)
Active Results: 5249101 out of 10000000 (52.49101%)
Passive Results: 5500179 out of 10000000 (55.00178999999999%)
Active Results: 5249686 out of 10000000 (52.49686%)
Passive Results: 5501477 out of 10000000 (55.01477%)
Active Results: 5249980 out of 10000000 (52.49979999999999%)
Passive Results: 5499290 out of 10000000 (54.9929%)
The results speak for themselves.
The Outcomes get very dramatic if one of the bonuses is much larger than the other, and high defender bonuses will cause the system to favor the defender
The 2.5% difference only holds when the bonuses are equal. When they're unequal, it will skew slightly above or slightly below 2.5% for small differences, and drastically alter the outcomes for big differences. The following stats represent the difference in ability scores for the attacker and defender respectively—in other words, "Attacker: 5, Defender: 0" means the Attacker's bonus is 5 points more than the Defender's bonus. Only the difference matters: If the Attacker has a bonus of +7, and the Defender has a bonus of +4, the stats are precisely identical to a scenario where the Attacker has +3 and the Defender has +0.
//Difference is 2.5%
Attacker: 0, Defender: 0
Active Results: 5249125 out of 10000000 (52.49125%)
Passive Results: 5499626 out of 10000000 (54.99626%)
//Note that Attacker:2, Defender:1 has identical odds/similar results
Attacker: 1, Defender: 0
Active Results: 5722711 out of 10000000 (57.22711%)
Passive Results: 6000753 out of 10000000 (60.007529999999996%)
//Attacker:3, Defender:1; Attacker:4, Defender:2, etc.
Attacker: 2, Defender: 0
Active Results: 6174039 out of 10000000 (61.74039%)
Passive Results: 6499936 out of 10000000 (64.99936%)
Attacker: 3, Defender: 0
Active Results: 6601101 out of 10000000 (66.01101%)
Passive Results: 7000450 out of 10000000 (70.00450000000001%)
//Difference is 5%, passive is like the attacker has a +1.2 + bonus in active
Attacker: 4, Defender: 0
Active Results: 7000297 out of 10000000 (70.00297%)
Passive Results: 7497731 out of 10000000 (74.97731%)
Attacker: 5, Defender: 0
Active Results: 7375115 out of 10000000 (73.75115%)
Passive Results: 8000631 out of 10000000 (80.00631%)
//Effective attacker bonus is 2 + bonus
Attacker: 6, Defender: 0
Active Results: 7726113 out of 10000000 (77.26113%)
Passive Results: 8501084 out of 10000000 (85.01084%)
//+4
Attacker: 7, Defender: 0
Active Results: 8051381 out of 10000000 (80.51380999999999%)
Passive Results: 8999331 out of 10000000 (89.99331000000001%)
//+5
Attacker: 8, Defender: 0
Active Results: 8350069 out of 10000000 (83.50069%)
Passive Results: 9500553 out of 10000000 (95.00553000000001%)
//Attacker wins *every roll*, as opposed to winning 86% of rolls
//Is effectively 10 + bonus
Attacker: 9, Defender: 0
Active Results: 8626220 out of 10000000 (86.2622%)
Passive Results: 10000000 out of 10000000 (100.0%)
Attacker: 10, Defender: 0
Active Results: 8875606 out of 10000000 (88.75606%)
Passive Results: 10000000 out of 10000000 (100.0%)
Attacker: 11, Defender: 0
Active Results: 9099772 out of 10000000 (90.99772%)
Passive Results: 10000000 out of 10000000 (100.0%)
Attacker: 12, Defender: 0
Active Results: 9300587 out of 10000000 (93.00587%)
Passive Results: 10000000 out of 10000000 (100.0%)
Attacker: 13, Defender: 0
Active Results: 9474565 out of 10000000 (94.74565%)
Passive Results: 10000000 out of 10000000 (100.0%)
Attacker: 14, Defender: 0
Active Results: 9625309 out of 10000000 (96.25309%)
Passive Results: 10000000 out of 10000000 (100.0%)
Attacker: 15, Defender: 0
Active Results: 9749404 out of 10000000 (97.49404%)
Passive Results: 10000000 out of 10000000 (100.0%)
Attacker: 16, Defender: 0
Active Results: 9850722 out of 10000000 (98.50721999999999%)
Passive Results: 10000000 out of 10000000 (100.0%)
Attacker: 17, Defender: 0
Active Results: 9925287 out of 10000000 (99.25287%)
Passive Results: 10000000 out of 10000000 (100.0%)
Attacker: 18, Defender: 0
Active Results: 9974967 out of 10000000 (99.74967%)
Passive Results: 10000000 out of 10000000 (100.0%)
Attacker: 19, Defender: 0
Active Results: 10000000 out of 10000000 (100.0%)
Passive Results: 10000000 out of 10000000 (100.0%)
Attacker: 20, Defender: 0
Active Results: 10000000 out of 10000000 (100.0%)
Passive Results: 10000000 out of 10000000 (100.0%)
//Now we consider situations where defender has a better bonus
Attacker: 0, Defender: 1
Active Results: 4750868 out of 10000000 (47.50868%)
Passive Results: 4998554 out of 10000000 (49.98554%)
Attacker: 0, Defender: 2
Active Results: 4277085 out of 10000000 (42.770849999999996%)
Passive Results: 4498389 out of 10000000 (44.983889999999995%)
Attacker: 0, Defender: 3
Active Results: 3824786 out of 10000000 (38.24786%)
Passive Results: 4002931 out of 10000000 (40.02931%)
Attacker: 0, Defender: 4
Active Results: 3399840 out of 10000000 (33.998400000000004%)
Passive Results: 3500342 out of 10000000 (35.00342%)
//Curiously, passive starts to harm attacker in this situation
Attacker: 0, Defender: 5
Active Results: 2999828 out of 10000000 (29.99828%)
Passive Results: 2996882 out of 10000000 (29.96882%)
//Effectively attacker -1
Attacker: 0, Defender: 6
Active Results: 2626743 out of 10000000 (26.267430000000004%)
Passive Results: 2499426 out of 10000000 (24.994259999999997%)
Attacker: 0, Defender: 7
Active Results: 2275216 out of 10000000 (22.75216%)
Passive Results: 2001180 out of 10000000 (20.011799999999997%)
//Effectively attacker -2
Attacker: 0, Defender: 8
Active Results: 1949354 out of 10000000 (19.49354%)
Passive Results: 1498727 out of 10000000 (14.98727%)
//-3
Attacker: 0, Defender: 9
Active Results: 1650522 out of 10000000 (16.50522%)
Passive Results: 999070 out of 10000000 (9.9907%)
//-4
Attacker: 0, Defender: 10
Active Results: 1375942 out of 10000000 (13.75942%)
Passive Results: 500388 out of 10000000 (5.0038800000000005%)
//Attacker cannot win rolls
//Effectively -9
Attacker: 0, Defender: 11
Active Results: 1125553 out of 10000000 (11.25553%)
Passive Results: 0 out of 10000000 (0.0%)
Attacker: 0, Defender: 12
Active Results: 899999 out of 10000000 (8.999989999999999%)
Passive Results: 0 out of 10000000 (0.0%)
Attacker: 0, Defender: 13
Active Results: 700584 out of 10000000 (7.005840000000001%)
Passive Results: 0 out of 10000000 (0.0%)
Attacker: 0, Defender: 14
Active Results: 525539 out of 10000000 (5.25539%)
Passive Results: 0 out of 10000000 (0.0%)
Attacker: 0, Defender: 15
Active Results: 375152 out of 10000000 (3.7515199999999997%)
Passive Results: 0 out of 10000000 (0.0%)
Attacker: 0, Defender: 16
Active Results: 250269 out of 10000000 (2.5026900000000003%)
Passive Results: 0 out of 10000000 (0.0%)
Attacker: 0, Defender: 17
Active Results: 149511 out of 10000000 (1.49511%)
Passive Results: 0 out of 10000000 (0.0%)
Attacker: 0, Defender: 18
Active Results: 74403 out of 10000000 (0.7440300000000001%)
Passive Results: 0 out of 10000000 (0.0%)
Attacker: 0, Defender: 19
Active Results: 25251 out of 10000000 (0.25251%)
Passive Results: 0 out of 10000000 (0.0%)
Attacker: 0, Defender: 20
Active Results: 0 out of 10000000 (0.0%)
Passive Results: 0 out of 10000000 (0.0%)
To summarize for people who have difficulty reading a lot of stats, if OP's ruleset is referred to as Passive, and 5e-default is Active, then:
- In the range Defender+4 to Attacker+3, Passive yields a +2.5% bonus
- At Passive-Attacker+4, equivalent is Active-Attacker+5
- At Passive-Attacker+6, equivalent is Active-Attacker+8
- At Passive-Attacker+9, Attacker wins every roll, always, is equivalent to Active-Attacker+19
- At Passive-Defender+5, equivalent is Active-Defender+5
- At Passive-Defender+6, equivalent is Active-Defender+7
- At Passive-Defender+11, the Defender wins every roll, always, is equivalent to Active-Defender+20
The good news is, bonus discrepancies like I showed are pretty rare: unless your party is fighting a creature way outside their effective CR, bonus differences greater than 8 really shouldn't ever happen.
The bad news is, a lot of this stuff goes against the 5e policy of ensuring Bounded Accuracy: by creating scenarios where an opponent can literally win every single ability roll against an opponent, beyond a certain differential in ability. Furthermore, Expertise is an easy way to boost a score into the +9 range, which would make this system dangerous and easy to exploit for any creature with expertise in a skill.
Example of how this would play in practice
You are a level 5 Bard, with expertise in Deception. You've been caught by the king in bed with his son, and need to explain yourself. Now let's give the king some credit: he's not a total idiot. He's probably got a Wisdom score of 12, giving him a +1 to Insight checks.
But there's a problem, for him at least: You, the charming bard, have a +10 to your Deception check. Now, normally, you'd probably have to roll with disadvantage, because you're in a compromising situation: even with all your bonuses, you'd still need some luck to evade consequences. In the normal 5e system, you'd have an 86% chance of passing any given roll, and with disadvantage, your odds of passing are (0.86)^2, which is 74%, about 3/4. That's pretty reasonable, given your ability to lie your pants off (in this case, apparently literally).
But in the system OP suggests, it doesn't really matter: at +1, the bonus the king receives is automatically 11. With a bonus of +10, the lowest possible roll you can make is 11, which beats the king's insight score (remember that ability checks don't have critical failures). Even if the king is much smarter (Insight +4), you've still improved a 65% chance of success to a 81% chance of success, going from 2/3 to 4/5.
And this generally applies to any Rogue/Bard with expertise in a skill for their favored ability score: unless the creatures they face are artificially buffed beyond what their CR would normally allow, they'll be able to walk all over anyone with any ability check using their scores.
I probably wouldn't implement this system
It's relatively harmless at lower level/lower differences in bonuses, but it violates a core design principle of 5e in more drastic scenarios, and could upset the overall balance of creatures that have unusually high bonuses for one or more ability score.
Code, for reference (written in Java):
import java.util.Objects;
import java.util.Random;
public class ProbabilityTesting {
public static class Pair<K,V> implements Cloneable{
public final K first;
public final V second;
public Pair() {
this(null, null);
}
public Pair(K first, V second) {
this.first = first;
this.second = second;
}
public boolean equals(Object o) {
if(this == o) return true;
if(!(o instanceof Pair<?,?>)) {
return false;
}
try {
@SuppressWarnings("unchecked")
Pair<K,V> p = (Pair<K,V>)o;
return Objects.equals(first, p.first) && Objects.equals(second, p.second);
} catch (ClassCastException e) {
return false;
}
}
@Override
public Object clone() {
return new Pair<>(first, second);
}
public static<K,V> Pair<K, V> of(K k, V v) {
return new Pair<>(k, v);
}
}
private static class Calculator {
private boolean use_passive;
private int attacker_bonus;
private int defender_bonus;
private int num_of_trials;
public Calculator(boolean use_passive, int attacker_bonus, int defender_bonus, int num_of_trials) {
this.use_passive = use_passive;
this.attacker_bonus = attacker_bonus;
this.defender_bonus = defender_bonus;
this.num_of_trials = num_of_trials;
}
public Pair<Integer, Integer> call() throws Exception {
int successes = 0;
Random rand = new Random();
for(int i = 0; i < num_of_trials; i++) {
int attacker_score = rand.nextInt(20) + 1 + attacker_bonus;
int defender_score;
if(use_passive)
defender_score = 10 + defender_bonus;
else
defender_score = rand.nextInt(20) + 1 + defender_bonus;
//Attacker wins ties
if(attacker_score >= defender_score)
successes++;
}
return Pair.of(successes, num_of_trials);
}
}
public static void main(String[] args) throws Exception {
for(int i = 0; i < 41; i++) {
int attacker_bonus, defender_bonus;
if(i < 21) {
attacker_bonus = i;
defender_bonus = 0;
} else {
attacker_bonus = 0;
defender_bonus = i - 20;
}
Calculator active = new Calculator(false, attacker_bonus, defender_bonus, 10_000_000);
Calculator passive = new Calculator(true, attacker_bonus, defender_bonus, 10_000_000);
Pair<Integer, Integer> active_results = active.call(), passive_results = passive.call();
System.out.println("Attacker: " + attacker_bonus + ", Defender: " + defender_bonus);
System.out.println("Active Results: " + active_results.first + " out of " + active_results.second + " (" + (active_results.first / (double)active_results.second * 100) + "%)");
System.out.println("Passive Results: " + passive_results.first + " out of " + passive_results.second + " (" + (passive_results.first / (double)passive_results.second * 100) + "%)");
System.out.println();
}
}
}