Dice Roller

Type 3d6+2. Get the roll — and the exact odds it was up against.

Runs locally

Press Roll. Every die reads from your operating system’s cryptographic random source — no modulo, no Math.random.

Runs entirely in your browser — open DevTools and check the Network tab

Type the dice the way tables have written them for fifty years and press Roll. What separates this from the dozens of other dice pages is not the animation: it is that the running statistics carry a column of exact probabilities, computed by convolution rather than estimated from your rolls. So when a total looks improbable, you can find out whether it actually was.

Dice notation, and everything this box accepts

The notation is NdM: N dice with M faces each. 2d6 is two six-sided dice, d20 is a single twenty-sided die, and the number in front can be left out entirely when it is one. A modifier goes on the end with a plus or a minus, so 3d6+2 rolls three six-sided dice and adds two to the total. You can add whole groups together as well, which is how weapon damage and spell effects are usually written: 2d6+1d8-1 rolls both sets and applies the modifier once, at the end.

Two suffixes cover the cases that come up constantly at a table and that almost no online roller supports. kh keeps the highest dice and kl keeps the lowest: 4d6kh3 rolls four six-sided dice and adds the best three, which is the standard way of generating an ability score, and 2d20kh1 and 2d20kl1 are advantage and disadvantage. Dice that were rolled but dropped are shown in brackets rather than hidden, and that is deliberate — a keep-highest roll that quietly discards its losers looks identical to one that never rolled them.

Percentile dice have a shorthand of their own: d% means d100. Any number of faces from 2 to 1000 works, including the ones no physical die has, because a die with seventeen faces is a perfectly well-defined random variable even though nobody can injection-mould a fair one. Anything the parser cannot read comes back with a specific complaint rather than a generic "invalid format", because a message that does not say which part is wrong leaves you guessing.

Totals are not uniform, and that is the whole point

A single die is flat: every face is equally likely, and that is the property people usually mean when they say "random". The moment you add two dice together, that stops being true, and the mistake is more common than it looks. With 2d6 there are thirty-six equally likely outcomes and six of them total seven, but only one totals two. Seven is not slightly more likely than snake eyes — it is six times more likely. With 3d6 the effect gets sharper: twenty-seven of the two hundred and sixteen outcomes total ten, against exactly one that totals three.

This is why the choice between 1d20 and 3d6 is a design decision rather than a matter of taste. A d20 gives a flat spread, so a plus-two bonus is worth exactly ten percentage points no matter where you are on the scale. Three six-sided dice give a hump in the middle, so the same bonus is worth a great deal near the centre and almost nothing out at the extremes. Systems pick one or the other on purpose, and describing a 3d6 system as "swingy" gets it exactly backwards.

The second table on this page puts the exact odds next to what you actually rolled. Those odds are not derived from your results — they are computed by convolving the distribution of each dice group, so the two columns are genuinely independent, which is the only arrangement in which comparing them means anything. For keep-highest and keep-lowest rolls the exact distribution is enumerated instead, and when a request is too large to enumerate honestly the column is left blank rather than filled with an approximation dressed up as a fact.

Where each face comes from

Every die on this page takes a value from crypto.getRandomValues, your operating system’s cryptographic random source, and folds it into the number of faces using rejection sampling. The usual shortcut is Math.floor(Math.random() * 6), and it has two separate problems that are worth keeping apart. The first is that the underlying pool of values is essentially never an exact multiple of the number of faces. JavaScript’s integer pool of two to the fifty-third divided by six leaves a remainder of two, so without rejection the two lowest faces each receive one extra slot.

For a six-sided die that works out to two of the six faces getting one extra slot each out of 1,501,199,875,790,165 — far below anything any table could ever detect, and we are not going to pretend otherwise. It grows with the number of faces, and it is trivially avoidable: compute the largest value that divides evenly by the number of faces, discard anything at or above it, and draw again. The discarded region is vanishingly small and what remains partitions exactly, so every face becomes exactly equally likely instead of approximately.

The second problem is the one that actually matters, and it has nothing to do with fairness. Math.random in Chrome and Edge is xorshift128+, and its internal state can be recovered from a modest run of consecutive outputs, after which every future value is computable. That is irrelevant for a solo game and disqualifying the moment anybody has a reason to know the next roll in advance. Since the correct source is one function call away and costs nothing, there is no case in which the shortcut is the right decision.

When the dice feel rigged

Dice have no memory, and almost every complaint about a roller comes down to expecting them to. A d20 that has come up one three times running is exactly as likely to come up one again as it was the first time. The run itself is not evidence of anything: three consecutive ones happen on one set of three rolls in eight thousand, and a group that gets through a few thousand d20 rolls over a campaign should expect to meet one. What would genuinely be suspicious is the opposite — a source that never produced runs would be failing to be random rather than succeeding at being fair.

The other half of the feeling comes from remembering the wrong things. A critical failure at the worst possible moment is memorable; the forty unremarkable rolls before it are not. That is why the statistics on this page are cumulative and mechanical rather than a summary you have to trust: the face table shows the uniformity check, the totals table shows the shape check, and both come with the size of the wobble you should expect at your sample size, because a table of counts without that number is unreadable.

If you do want to catch a genuinely biased die, the one in your hand is a far better candidate than the one on your screen. Casino dice are machined to tight tolerances with flush pips of the same density as the body, precisely because that is what it takes; ordinary injection-moulded dice with drilled pips are lighter on the high-numbered faces and are not manufactured to any fairness standard at all. A d20 floated in heavily salted water and spun repeatedly will keep presenting the same few faces if it is unbalanced, which is a test you can run at home in ten minutes.

Nothing here leaves your device

There is no request when you press Roll. The randomness comes from your own machine, the running tally lives in this tab’s memory, and it is gone when you close it. No result is recorded on a server, which also means no result can be produced afterwards as evidence of anything — a property that matters more than it sounds whenever a roll decides something between two people.

It is verifiable in about ten seconds rather than something you have to take on faith. Open your browser’s developer tools, switch to the Network tab, and roll as much as you like: the list stays empty. This site also sends a Content-Security-Policy that restricts network connections to its own origin, and your browser enforces that regardless of what our code does.

The same architecture is why it works with no signal. After the first visit the page is cached, and since the entropy comes from your operating system rather than a remote service, there is nothing left to be offline from. A dice roller that needs a connection is a dice roller that stops working in the one place tables often are, which is a basement with bad reception.

Frequently asked questions

What does 4d6kh3 mean?

Roll four six-sided dice and add the highest three, discarding the lowest. It is the standard method for generating an ability score, and it produces a noticeably higher average than 3d6 because the worst die is thrown away. The dropped die is shown in brackets so you can see it was actually rolled.

Can I roll several different dice in one go?

Yes. Add the groups together in one expression: 2d6+1d8-1 rolls both sets and applies the modifier once at the end. You can also raise "rolls at once" to repeat the whole expression, which is how you get a full set of six ability scores from 4d6kh3 in a single press.

Why is seven so much more common than two on 2d6?

Because there are six ways to make seven from two dice and only one way to make two. Adding dice together turns a flat distribution into a humped one, and the more dice you add the sharper the hump becomes. The totals table shows the exact probability of every total, so the shape is something you can read rather than something you have to remember.

Are these dice actually fair?

Each face is drawn from your operating system’s cryptographic random source with rejection sampling, so all faces are exactly equally likely — there is no modulo step where a bias could enter. The face table is there so you can check that rather than believe it, and it tells you how much variation is normal at your sample size.

Why did my statistics reset when I changed the dice?

Because you changed the dice. The distribution of 2d6 and the distribution of 3d6 are different shapes, and pooling them would produce a table that describes neither while still looking like evidence. Changing "rolls at once" does not reset anything, since it does not change the distribution.

Can I set a seed to reproduce a roll?

No, and that is deliberate. A cryptographic source has no reproducible seed by design, and a seed you could inspect would be a seed someone else could predict — which is the property you least want when a roll decides something. If you need reproducible pseudo-randomness for a simulation, that is a genuinely different requirement.

Does anything get sent to a server?

No. Every die is rolled by your own browser. You can confirm it in the Network tab of your developer tools, and the site’s Content-Security-Policy restricts connections to its own origin regardless of what our code does.