In Dungeons and Dragons bepalen de dobbelstenen mede het lot van de avonturiers. Via een twintigzijdige dobbelsteen, de d20, wordt bepaald of dat een behaalde handeling wel of niet slaagt door deze te vergelijken met de door de Dungeon Master vastgestelde moeilijkheidsgraad (difficulty class, DC). In sommige gevallen wordt het lot gestuurd richting succes of falen via een mechanisme dat in Dungeons and Dragons-termen Advantage/Disadvantage wordt genoemd. In dit geval worden er 2 d20’s gedobbeld, waarvan respectievelijk de hoogste of laagst gedobbelde waarde wordt behouden. Maar wat is nu het effect hiervan? Hoeveel hoger of lager is de verwachtingswaarde? Hoe veel groter is de kans op een natural 20 of natural 1 (20 of 1 op de dobbelsteen)?

We kunnen hiervoor diep de statistiek induiken, maar de wiskunde erachter is vrij complex. Het is sneller–en wellicht voor velen intuitiever–om dit te benaderen via een zogenoemde Monte Carlo simulatie. In een dergelijke simulatie worden vele instanties van een experiment numeriek uitgevoerd en kunnen we kijken naar de onderliggende verdelingen. De details over hoe je dit in Python kunt doen, vindt je onderaan dit artikel, maar laten we vooral kijken naar de resultaten.

Effectieve bonus

Als je 1d20 dobbelt is de verwachtingswaarde 10.5, maar als je 2d20 dobbelt en de hoogste waarde gebruikt (Advantage) wordt de verwachtingswaarde ongeveer 13.9. Op dezelfde wijze is de verwachtingswaarde van 2d20 waarvan je de laagste waarde gebruikt ongeveer 7.1. In Dungeons and Dragons-termen, geven Advantage en Disadvantage je dus een +3.3 of een -3.3 bonus/straf op je worp. Voor het gemak kun je rekenen met modifiers van Advantage +3 en Disadvantage -3.

De regels van Dungeons and Dragons gaan hier iets anders mee om voor Passive Checks. Volgens de regels:

“If the character has advantage on the check, add 5. For disadvantage, subtract 5. The game refers to a passive check total as a score.”

Modifiers worden in Dungeons and Dragons berekend uit een Ability Score als Modifier = (Score – 10)/2. Het resultaat wordt vervolgend naar beneden afgerond. Als we de andere kant op willen rekenen dan krijgen we Score = Modifier x 2 + 10. Een +3.3 modifier voor Advantage, zou dus overeen moeten komen met een verandering van +6.6 in Score in het geval van Advantage (of -6.6 in het geval van Disadvantage). Advantage of Disadvantage op Passive Checks zijn dus minder voordelig/nadelig dan Advantage en Disadvantage op Active Checks (effectieve wijziging van ± 5 i.p.v. ± 6.6 op je score).

Kans op Natural 20 en Natural 1

Als je 1d20 dobbelt is de kans op een Natural 1 of een Natural 20 (1 of 20 op de dobbelsteen) 5% (1 op 20). Bij advantage verandert de kans op een Natural 20 naar ongeveer 10%, en die van een Natural 1 naar 0.25% (1 op 400). Andersom geldt hetzelfde bij Disadvantage: de kans op een Natural 1 wordt ongeveer 10% en de kans op een Natural 20 wordt 0.25%.

Ruling voor Conjure/Summon spreuken

Er zijn in Dungeons and Dragons 5e enkele spreuken waarmee meerdere wezens kunnen worden opgeroepen: Conjure Animals, Conjure Minor Elementals, Conjure Woodland Beings en Summon Lesser Demons. Hiermee kunnen tot 8 extra wezens aan een gevecht worden toegevoegd. Alle aanvallen van deze monsters afzonderlijk afhandelen werkt vertragend. Daarom is besloten de extra wezens 1 gemeenschappelijke aanvalsworp te geven en 1 gemeenschappelijke schade worp. Per wezen wordt nog wel bekeken of het eigen doelwit wel of niet wordt geraakt op basis van de gemeenschappelijke aanvalsworp en de Armor Class (AC) van het doelwit.

In sommige gevallen krijgt een opgeroepen wezen Advantage (bijvoorbeeld via de Pack Tactics regel in het geval van de Wolf) of Disadvantage. Omdat er nog maar 1 aanvalsworp wordt gemaakt, kan er niet met Advantage en Disadvantage worden gewerkt. De wezens werken immers onafhankelijk van elkaar, en de ene kan wel Advantage krijgen en de andere niet. Daarom krijgen de individuele wezens daarom een +3 of -3 modifier bovenop de gemeenschappelijke aanvalsworp als ze recht hebben op Advantage of Disadvantage.

Doordat er geen Advantage mogelijk is, is de kans op een Natural 20 maar 5% i.p.v. 10%. De kans op een Natural 1 blijft daardoor ook 5% i.p.v. 0.25%. De kans op hogere schade dan normaal mogelijk is dus niet groter. Daartegenover staat dat Disadvantage ook niet mogelijk is en de kans op een Natural 1 ook maar 5% is i.p.v. 10% en de kans op een Natural 20 5% blijft i.p.v. terug wordt gebracht tot 0.25%.

In het specifieke geval van de Wolf met Pack Tactics daalt de gemiddelde schade per hit van 7.8 met Advantage naar 7.4 met de aangepaste regel. Dit is een kleine en in mijn ogen acceptabele reductie (nerf).

Bijlage: Monte Carlo simulatie in Python

Mijn code voor het draaien van deze Monte Carlo simulatie in Python 3.x is hieronder te lezen.

import numpy as np

def dx(x, n):
    # create a generator:
    rng = np.random.default_rng()
    return rng.integers(low=1, high=x+1, size=int(n))

def d20(n):
    return dx(20, n)

def advantage(n):
    d20_1 = d20(n)
    d20_2 = d20(n)
    d20_adv = np.where(d20_1 > d20_2, d20_1, d20_2)
    return d20_adv

def disadvantage(n):
    d20_1 = d20(n)
    d20_2 = d20(n)
    d20_dis = np.where(d20_1 < d20_2, d20_1, d20_2)
    return d20_dis


if __name__ == '__main__':
    # Run the monte carlo simulation 10k times
    n = 1e4

    # roll n x d20
    nd20 = d20(n)

    # probability of landing a nat 20 (should be approx 5% or 0.05)
    nat20s = np.count_nonzero(nd20 == 20)
    p_nat1d20 = nat20s/n
    mean_1d20 = np.mean(nd20)
    print(f"P(1d20 = 20) = {p_nat1d20:0.2f}")
    print(f"E(1d20) = {mean_1d20:0.2f}")

    # Advantage
    nd20 = advantage(n)
    nat20s = np.count_nonzero(nd20 == 20)
    p_adv = nat20s/n
    mean_adv = np.mean(nd20)
    print(f"P(2d20 = 20, adv) = {p_adv:0.2f}")
    print(f"E(2d20, adv) = {mean_adv:0.2f}")
    print(f"Effective bonus = +{mean_adv - mean_1d20:0.1f}")

    # Disadvantage
    nd20 = disadvantage(n)
    nat20s = np.count_nonzero(nd20 == 20)
    p_dis = nat20s/n
    mean_dis = np.mean(nd20)
    print(f"P(2d20 = 20, dis) = {p_dis:0.2f}")
    print(f"E(2d20, dis) = {mean_dis:0.2f}")
    print(f"Effective penalty = {mean_dis - mean_1d20:0.1f}")
Back to Top