NatStats - A D&D Experiment

July, 2025

I love data almost as much as I love Dungeons & Dragons. So naturally, I’ve spent more time than I’d like to admit thinking about dice rolls, randomness, and whether some characters are just... luckier than others.

My groups play online using Roll20, which handles dice rolls through their random number generator, QuantumRoll. Their site even shows the math: the current average for a d20 is 10.5091 which is basically perfect. But that’s over 189,000 rolls (as of writing this, it updates regularly). No individual player comes close to rolling that much. And as any D&D player knows, it feels like some characters are particularly lucky or unlucky. 

The Goblin That Started It All

Back in 2020, I played a goblin monk named Cricket.  It always felt like she rolled more Natural 1s than any character I’ve ever played, but also more Natural 20s. It suited her chaotic energy, but I started tracking her rolls out of curiosity. After logging 191 d20 rolls, I found that 9% were Nat 20s and 10% were Nat 1s which is much higher than the 5% they each should have been. 

Down the rabbit hole

A few years and two campaigns later, I came back to this project. I was playing a character who seemed weirdly unlucky. I wanted to see if the numbers backed it up not just for me, but across our whole table. 

Manually tracking rolls wasn’t realistic, so I used Python. First, I saved the Roll20 log for our campaign. Then I ran it through a modified version of a roll parser, which pulled out each raw roll, who rolled it, and when.

Next, I wrote a script to clean and organize the data. I needed to standardizing character names, remove test rolls, and group everything by session. What started as a single text string: "Emery Wess rolled a 1d20 for 14 on April 24, 2020 (#22)" turned into structured data like: { "name": "Emery", "roll": 14, "date": "Session 1" }

Once parsed and organized, I used Google Sheets to calculate a number of stats including average roll per character and percentage of Natural 1s and 20s. As it turns out when you look at averages for 5,583 rolls across a two-year campaign, the averages get pretty close to perfect. 

Visualizing the trends

Because I’m a designer, and I was having fun, I didn’t just want to send a list or a spreadsheet to my friends to show them what I’d found. So I explored what an app might look like to show this data. I’d love to build it someday, but for now it’s mostly a manual process (thanks, Roll20 limitations). Still, I find myself coming back to the idea every so often, tinkering with ways to make it real.

Sometimes, you just want to know: am I lucky, or am I cursed? Now I can answer that with data.