Many checks at once
At the table
You want a grid: for many modifiers and target numbers, what is the chance 2d10 + modifier meets each target?
Try it
In the playground, open this lesson in the playground and click Run (or press Shift+Enter).
The script
↗roll = 2d10
rows = [
("modifier {}, target {}".format(mod, target), (roll + mod).p_ge(target))
for mod in range(-2, 11)
for target in range(0, 11)
]
output("success_grid", prob_table(rows))
success_grid · Table
| outcome | % | frac | X |
|---|---|---|---|
| modifier -2, target 0 | 100.0 | 1 | 1.000 |
| modifier -2, target 1 | 99.0 | 99/100 | 0.990 |
| modifier -2, target 2 | 97.0 | 97/100 | 0.970 |
| modifier -2, target 3 | 94.0 | 47/50 | 0.940 |
| modifier -2, target 4 | 90.0 | 9/10 | 0.900 |
| modifier -2, target 5 | 85.0 | 17/20 | 0.850 |
| modifier -2, target 6 | 79.0 | 79/100 | 0.790 |
| modifier -2, target 7 | 72.0 | 18/25 | 0.720 |
| modifier -2, target 8 | 64.0 | 16/25 | 0.640 |
| modifier -2, target 9 | 55.0 | 11/20 | 0.550 |
| modifier -2, target 10 | 45.0 | 9/20 | 0.450 |
| modifier -1, target 0 | 100.0 | 1 | 1.000 |
| modifier -1, target 1 | 100.0 | 1 | 1.000 |
| modifier -1, target 2 | 99.0 | 99/100 | 0.990 |
| modifier -1, target 3 | 97.0 | 97/100 | 0.970 |
| modifier -1, target 4 | 94.0 | 47/50 | 0.940 |
| modifier -1, target 5 | 90.0 | 9/10 | 0.900 |
| modifier -1, target 6 | 85.0 | 17/20 | 0.850 |
| modifier -1, target 7 | 79.0 | 79/100 | 0.790 |
| modifier -1, target 8 | 72.0 | 18/25 | 0.720 |
| modifier -1, target 9 | 64.0 | 16/25 | 0.640 |
| modifier -1, target 10 | 55.0 | 11/20 | 0.550 |
| modifier 0, target 0 | 100.0 | 1 | 1.000 |
| modifier 0, target 1 | 100.0 | 1 | 1.000 |
| modifier 0, target 2 | 100.0 | 1 | 1.000 |
| modifier 0, target 3 | 99.0 | 99/100 | 0.990 |
| modifier 0, target 4 | 97.0 | 97/100 | 0.970 |
| modifier 0, target 5 | 94.0 | 47/50 | 0.940 |
| modifier 0, target 6 | 90.0 | 9/10 | 0.900 |
| modifier 0, target 7 | 85.0 | 17/20 | 0.850 |
| modifier 0, target 8 | 79.0 | 79/100 | 0.790 |
| modifier 0, target 9 | 72.0 | 18/25 | 0.720 |
| modifier 0, target 10 | 64.0 | 16/25 | 0.640 |
| modifier 1, target 0 | 100.0 | 1 | 1.000 |
| modifier 1, target 1 | 100.0 | 1 | 1.000 |
| modifier 1, target 2 | 100.0 | 1 | 1.000 |
| modifier 1, target 3 | 100.0 | 1 | 1.000 |
| modifier 1, target 4 | 99.0 | 99/100 | 0.990 |
| modifier 1, target 5 | 97.0 | 97/100 | 0.970 |
| modifier 1, target 6 | 94.0 | 47/50 | 0.940 |
| modifier 1, target 7 | 90.0 | 9/10 | 0.900 |
| modifier 1, target 8 | 85.0 | 17/20 | 0.850 |
| modifier 1, target 9 | 79.0 | 79/100 | 0.790 |
| modifier 1, target 10 | 72.0 | 18/25 | 0.720 |
| modifier 2, target 0 | 100.0 | 1 | 1.000 |
| modifier 2, target 1 | 100.0 | 1 | 1.000 |
| modifier 2, target 2 | 100.0 | 1 | 1.000 |
| modifier 2, target 3 | 100.0 | 1 | 1.000 |
| modifier 2, target 4 | 100.0 | 1 | 1.000 |
| modifier 2, target 5 | 99.0 | 99/100 | 0.990 |
| modifier 2, target 6 | 97.0 | 97/100 | 0.970 |
| modifier 2, target 7 | 94.0 | 47/50 | 0.940 |
| modifier 2, target 8 | 90.0 | 9/10 | 0.900 |
| modifier 2, target 9 | 85.0 | 17/20 | 0.850 |
| modifier 2, target 10 | 79.0 | 79/100 | 0.790 |
| modifier 3, target 0 | 100.0 | 1 | 1.000 |
| modifier 3, target 1 | 100.0 | 1 | 1.000 |
| modifier 3, target 2 | 100.0 | 1 | 1.000 |
| modifier 3, target 3 | 100.0 | 1 | 1.000 |
| modifier 3, target 4 | 100.0 | 1 | 1.000 |
| modifier 3, target 5 | 100.0 | 1 | 1.000 |
| modifier 3, target 6 | 99.0 | 99/100 | 0.990 |
| modifier 3, target 7 | 97.0 | 97/100 | 0.970 |
| modifier 3, target 8 | 94.0 | 47/50 | 0.940 |
| modifier 3, target 9 | 90.0 | 9/10 | 0.900 |
| modifier 3, target 10 | 85.0 | 17/20 | 0.850 |
| modifier 4, target 0 | 100.0 | 1 | 1.000 |
| modifier 4, target 1 | 100.0 | 1 | 1.000 |
| modifier 4, target 2 | 100.0 | 1 | 1.000 |
| modifier 4, target 3 | 100.0 | 1 | 1.000 |
| modifier 4, target 4 | 100.0 | 1 | 1.000 |
| modifier 4, target 5 | 100.0 | 1 | 1.000 |
| modifier 4, target 6 | 100.0 | 1 | 1.000 |
| modifier 4, target 7 | 99.0 | 99/100 | 0.990 |
| modifier 4, target 8 | 97.0 | 97/100 | 0.970 |
| modifier 4, target 9 | 94.0 | 47/50 | 0.940 |
| modifier 4, target 10 | 90.0 | 9/10 | 0.900 |
| modifier 5, target 0 | 100.0 | 1 | 1.000 |
| modifier 5, target 1 | 100.0 | 1 | 1.000 |
| modifier 5, target 2 | 100.0 | 1 | 1.000 |
| modifier 5, target 3 | 100.0 | 1 | 1.000 |
| modifier 5, target 4 | 100.0 | 1 | 1.000 |
| modifier 5, target 5 | 100.0 | 1 | 1.000 |
| modifier 5, target 6 | 100.0 | 1 | 1.000 |
| modifier 5, target 7 | 100.0 | 1 | 1.000 |
| modifier 5, target 8 | 99.0 | 99/100 | 0.990 |
| modifier 5, target 9 | 97.0 | 97/100 | 0.970 |
| modifier 5, target 10 | 94.0 | 47/50 | 0.940 |
| modifier 6, target 0 | 100.0 | 1 | 1.000 |
| modifier 6, target 1 | 100.0 | 1 | 1.000 |
| modifier 6, target 2 | 100.0 | 1 | 1.000 |
| modifier 6, target 3 | 100.0 | 1 | 1.000 |
| modifier 6, target 4 | 100.0 | 1 | 1.000 |
| modifier 6, target 5 | 100.0 | 1 | 1.000 |
| modifier 6, target 6 | 100.0 | 1 | 1.000 |
| modifier 6, target 7 | 100.0 | 1 | 1.000 |
| modifier 6, target 8 | 100.0 | 1 | 1.000 |
| modifier 6, target 9 | 99.0 | 99/100 | 0.990 |
| modifier 6, target 10 | 97.0 | 97/100 | 0.970 |
| modifier 7, target 0 | 100.0 | 1 | 1.000 |
| modifier 7, target 1 | 100.0 | 1 | 1.000 |
| modifier 7, target 2 | 100.0 | 1 | 1.000 |
| modifier 7, target 3 | 100.0 | 1 | 1.000 |
| modifier 7, target 4 | 100.0 | 1 | 1.000 |
| modifier 7, target 5 | 100.0 | 1 | 1.000 |
| modifier 7, target 6 | 100.0 | 1 | 1.000 |
| modifier 7, target 7 | 100.0 | 1 | 1.000 |
| modifier 7, target 8 | 100.0 | 1 | 1.000 |
| modifier 7, target 9 | 100.0 | 1 | 1.000 |
| modifier 7, target 10 | 99.0 | 99/100 | 0.990 |
| modifier 8, target 0 | 100.0 | 1 | 1.000 |
| modifier 8, target 1 | 100.0 | 1 | 1.000 |
| modifier 8, target 2 | 100.0 | 1 | 1.000 |
| modifier 8, target 3 | 100.0 | 1 | 1.000 |
| modifier 8, target 4 | 100.0 | 1 | 1.000 |
| modifier 8, target 5 | 100.0 | 1 | 1.000 |
| modifier 8, target 6 | 100.0 | 1 | 1.000 |
| modifier 8, target 7 | 100.0 | 1 | 1.000 |
| modifier 8, target 8 | 100.0 | 1 | 1.000 |
| modifier 8, target 9 | 100.0 | 1 | 1.000 |
| modifier 8, target 10 | 100.0 | 1 | 1.000 |
| modifier 9, target 0 | 100.0 | 1 | 1.000 |
| modifier 9, target 1 | 100.0 | 1 | 1.000 |
| modifier 9, target 2 | 100.0 | 1 | 1.000 |
| modifier 9, target 3 | 100.0 | 1 | 1.000 |
| modifier 9, target 4 | 100.0 | 1 | 1.000 |
| modifier 9, target 5 | 100.0 | 1 | 1.000 |
| modifier 9, target 6 | 100.0 | 1 | 1.000 |
| modifier 9, target 7 | 100.0 | 1 | 1.000 |
| modifier 9, target 8 | 100.0 | 1 | 1.000 |
| modifier 9, target 9 | 100.0 | 1 | 1.000 |
| modifier 9, target 10 | 100.0 | 1 | 1.000 |
| modifier 10, target 0 | 100.0 | 1 | 1.000 |
| modifier 10, target 1 | 100.0 | 1 | 1.000 |
| modifier 10, target 2 | 100.0 | 1 | 1.000 |
| modifier 10, target 3 | 100.0 | 1 | 1.000 |
| modifier 10, target 4 | 100.0 | 1 | 1.000 |
| modifier 10, target 5 | 100.0 | 1 | 1.000 |
| modifier 10, target 6 | 100.0 | 1 | 1.000 |
| modifier 10, target 7 | 100.0 | 1 | 1.000 |
| modifier 10, target 8 | 100.0 | 1 | 1.000 |
| modifier 10, target 9 | 100.0 | 1 | 1.000 |
| modifier 10, target 10 | 100.0 | 1 | 1.000 |
Strategy: one table, not many output calls
Calling output(name, probability) inside a loop is fine for a handful of values, but each call becomes its own one-row “Prob” block in the UI—repeated headers and hundreds of tiny tables.
For grids and parameter sweeps:
- Build a list of
(label, probability)rows—often with a comprehension over your parameter ranges. - Call
outputonce withprob_table(rows).
prob_table takes a list of (string label, probability) tuples. Probabilities are independent—they do not need to sum to 1 (unlike Outcomes / bucket outcomes, which describe a single roll).
Use a plain output(..., float) when you want exactly one probability. Use prob_table when you want one multi-row table with the same % / frac / X columns as distribution output.
Reading the result
One block output success_grid: Table with a row per modifier/target pair (labels like modifier -2, target 0, modifier 5, target 3, …). For a structured copy, open the json tab—table rows use "kind": "table".
Try this
- Narrow
rangein the editor to match your game (fewer lines). - Change
2d10to another roll you care about. - Tweak the label string (e.g.
"target {} @ modifier {}".format(target, mod)) if that sorts better in a spreadsheet.
What’s next
Ordered outcome labels—named success bands instead of only numeric totals.
See the user guide index and standard library reference for builtins.