As I’m guessing was true for many of you, my first introduction to probability theory was pages 9-10 of the AD&D DMG in which Gygax explains how rolling one die (including d100) gives you a uniform distribution but summing multiple dice gives you a bell curve. Ever since, it has been a basic principal of game design to distinguish between when a uniform distribution is desirable (e.g., action resolution) and when a bell curve is better (e.g., character abilities). Appreciation of uniform distributions (each value is equally likely) vs bell curves (moderate values are most likely) is all well and good but in probability and statistics there is a third major type of distribution that RPGS usually ignore: right-skewed distributions (low values are most likely). Note that in statistics “skew” means the direction the “tail” of the distribution is pointing. So on a right-skewed distribution, most cases are low (left) and it’s rare to have cases that are high (right).
There are a lot of things in life and even in fantasy worlds where low numbers are the most common values. The typical scroll should be low level, the typical orc war party should be small, etc. Alas, we generally don’t model this. I had this thought while reading Shadowdark and seeing the rules for generating rival adventuring parties. When it comes to level, you simply roll d6. I thought, huh, that’s weird, shouldn’t 1st and 2nd level parties be more common than 5th and 6th level parties?
I thought about it all day and came up with some pretty complicated mechanics and then realized there’s an incredibly simple approach.
Choose a die size that captures the range you want. Roll multiple dice and keep the lowest. The more dice you roll, the more right skewed the probability distribution will be.
For instance, suppose we wanted to roll for character level of rival adventuring parties and we wanted the range to be 1-6 with low values being more common. We could roll 2d6 and keep low and then we’d have the following probabilities for rolling different party levels:
- 1st — 30.6%
- 2nd — 25.0%
- 3rd — 19.4%
- 4th — 13.9%
- 5th — 8.3%
- 6th — 2.8%
If you want even more skew, roll 3d6 and keep lowest. That gives the following probabilities:
- 1st — 42.1%
- 2nd — 28.2%
- 3rd — 17.1%
- 4th — 8.8%
- 5th — 3.2%
- 6th — 0.4%
And of course you don’t just have to do it for d6. Let’s say you wanted to roll for the spell level on a scroll found in a treasure hoard, using the AD&D range of spell levels 1-9. We could roll d10 (where “10” is two spells or something else special). If we’re relatively deep in the dungeon we could roll 2d10 and keep lowest, which gives these probabilities: 1 (19%), 2 (17%), 3 (15%), 4 (13%), 5 (11%), 6 (9%), 7 (7%), 8 (5%), 9 (3%), 10 (1%). And if we’re relatively shallow in the dungeon we could roll 3d10 for these probabilities: 1 (27%), 2 (22%), 3 (17%), 4 (13%), 5 (9%), 6 (6%), 7 (4%), 8 (2%), 9 (0.7%), 10 (0.1%).
Or if we’re rolling for orc wilderness encounter size, maybe 2d100 keep low if it’s orc territory and 3d100 keep lowest if it’s far from orc territory. The probability function for 2d100 keep low gives a pretty linear decay and that for 3d100 keep lowest looks like this.
You don’t need to calculate or simulate the probabilities as long as you understand that adding more dice increases the right skew (that is, it makes low values especially common). However game designers might like to calculate the probabilities so if that’s you, here is my R code.
diesize <- 100 die1 <- seq(1:diesize) die2 <- die1 die3 <- die1 df.dice <- expand.grid(die1,die2,die3) df.dice <- df.d10s %>% mutate(low.2=if_else(Var1<Var2,Var1,Var2), low.3=if_else(low.2<Var3,low.2,Var3)) table(df.dice$low.2) %>% proportions() table(df.dice$low.3) %>% proportions() hist(df.dice$low.2) hist(df.dice$low.3)
Roll 2d# or 3d# and keep low is the best way I can figure for playing at the table, but here are a few alternatives I thought of or noticed for creating right skew.
The most obvious approach is to generate a table where uniform distribution dice map onto right skewed values. For instance, the B/X treasure table does this for scrolls. In Moldvay Basic, if you find a scroll, roll d6 and 1-3 it’s level one, 4-5 level two, and 6 level three. Similarly in Cook Expert, roll d100 and 1-25 is level 1, 26-50 level two, 51-70 level three, 71-85 level four, 86-95 level five, and 96-100 level six. The problem with this approach is you could easily fill half a DM screen with all the tables that would be necessary.
You can also use a software random number generator. I experimented with using the function
rpois() in R. There are a few problems with this. The obvious one is most people don’t game with R or Excel in front of them. Another is that the parameter for a Poisson is the population mean, which is a less intuitive concept than the range. A third is that a Poisson has a very specific shape which is a function of the mean in non-intuitive ways. There are more flexible functions, but they’re more complicated to work with. Using a Poisson or binomial pseudo-random number generator would be the way to go for programming a computer game, but it’s a non-starter for tabletop play.
Another approach would be to generate a bell curve and then take the absolute value of the difference from the central value. For instance, on 2d6, the central value is 7. This means rolling a seven gives 0, rolling either 6 or 8 gives 1, rolling either 5 or 9 gives 2, etc. This approach isn’t appealing as it requires a lot of arithmetic.
Knave uses 3d6 for character generation but instead of summing the dice, the pips tell you which attribute gets the mod. So most attributes will have a mod of zero and a few will have a mod between 1 and 3, usually 1. A closely related approach would be to create a geometric distribution by flipping a coin (including a biased “coin” like a d6 where values 3-6 are “heads” thereby giving 2:1 odds of “heads”) and counting how many “heads” you get before your first “tails.” The downside of this is it would take forever.
Probably the most popular right-skewed approach in use today is exploding dice (if you roll the max, roll again and add the new roll). This has the advantage that it’s very simple and also can be exciting in play, especially for damage. The disadvantage is it gives a weird step function distribution that’s uniform, then skips a digit, then is uniform again at a lower level. Also, when player-facing it creates a min-maxing puzzle of whether smaller dice are better since they’re more likely to explode.
Leave a Reply