Dice Wheel

The board game is out, the dice are wherever dice go. 6 segments of 60° each, faces 1–6, an exact 1-in-6 draw — and a roll the whole table can watch land. Those figures are computed at build time by the engine that runs the wheel.

Spin: roll 1–6

One spin = one die. For 2d6, spin twice — the history below keeps both rolls.

Press “Spin the wheel”. The winner is drawn by cryptographic randomness the instant you press — the spin you watch is just the announcement.

A roll everyone sees the same way

Physical dice have a social failure mode: the roll lands tilted against a book, someone re-rolls "because it was cocked", and the argument outlives the game. A wheel spin has no cocked state — the announced face is the face, the deceleration is visible to the whole table, and the session history sits below the wheel for anyone who wants to audit turn seven. For video calls it is even better: share the tab and remote players watch the same roll instead of trusting a dice report from off-camera.

Reading the result is deliberate. The winning face appears in the result box once the wheel settles — immediately, if your system asks for reduced motion — and the spin history below the wheel lists the most recent rolls, newest first, so a recent turn is a glance, not a memory contest. Nothing in that history changes the next roll. How the coin, dice and number wheels are the same draw over different lists is the subject of the guide Wheel versus coin versus dice; the rest of this page explains what this wheel does, why each rule exists, and where it stops.

What happens when you press Spin

The preset list is the 6 faces 1 through 6, in that order. The engine divides the circle into 6 equal segments of 60° each — face 1 runs from 0° to 60°, face 6 from 300° to 360° — and every face wins with probability 1/6, which is 16.67%. The geometry is for the eyes only: the winner is chosen by index before the wheel moves, and the rotation is then calculated to stop with that segment's midpoint under the pointer. Every number in this paragraph is computed at build time by the same engine that runs the wheel, not typed into the page.

The pick itself is rejection sampling over the browser's cryptographically secure generator. To cover 6 outcomes the engine needs 3 bits, which can express 8 values; it draws a byte, keeps only the low 3 bits, and accepts the result if it is below 6. The 2 values at or beyond 6 are discarded and a fresh byte is drawn — never reduced with a remainder. Scripting the bytes makes this reproducible. Feed the engine the byte 201, which is 11001001 in binary: the low 3 bits are 001, that is index 1, so the wheel lands on face 2 at 90°. Feed it the bytes 7, 6, 5 instead: the first two are at or beyond 6 and are thrown away, the third is accepted as index 5, and the wheel lands on face 6 at 330°. Those bytes are scripted for illustration; a live spin fills them from crypto.getRandomValues.

Why not simply take a random value modulo 6? A byte holds 256 values, and 256 divided by 6 leaves a remainder of 4, so a remainder would silently favour the low-numbered faces — a small bias, but a bias, and a wheel that promises fairness cannot carry one. Rejection sampling redraws instead. Sweeping every one of the 256 possible byte values through the engine at build time, 192 are accepted on the first draw (75%) and the rest trigger a redraw, which is why redraws are rare and the spin feels instant. If your system asks for reduced motion the rotation is skipped and the identical draw is announced at once — the plainest evidence that the spinning was never the deciding part.

Other dice by editing the list

The list is editable, so the wheel becomes any die you can list: 1–4 for a d4, 1–8 for a d8, or nonstandard faces entirely — "move 2, lose a turn, roll again" house dice for the family board game. Eliminator mode turns it into a no-repeat dealer: 5 spins remove 5 faces in random order and the face left standing is the last one dealt, which is exactly how to assign 6 players to 6 starting positions without a single duplicate.

The geometry follows the list. Replace the faces with 1–4 and the engine builds 4 segments of 90° at 25% each; 1–8 gives 8 segments of 45° at 12.5% each; 1–20 gives 20 slivers of 18° at 5% each. The labels shrink as the count grows, and nothing else changes: every 18° sliver on a d20 list is drawn from the same uniform pick as every 60° segment on the d6, because probability comes from the draw, not the drawing. Past 100 faces the wheel refuses the list — the exact message is below — and for a quick 1-to-N without typing, the Number Wheel regenerates its list from a single maximum.

How the list is read matters once you type house dice. One entry per line is the rule. A single line containing commas is split on the commas instead, so pasting "1, 2, 3, 4" on one line produces 4 faces. Once the input has more than one line, commas stay inside entries: the lines "Move 2, then roll again", "Lose a turn" and "Swap places" parse to 3 faces, and the first keeps its comma — "Move 2, then roll again". Entries are trimmed, blank lines are dropped, and each face may be up to 80 characters. Paste 101 numbered lines and the engine returns, verbatim: "A wheel holds at most 100 entries — this list has 101. Remove some entries; nothing was silently dropped." It never quietly keeps the first 100.

Streaks, cold faces, and what the wheel does not remember

Each spin is an independent draw over the same 6 faces; the engine has no memory of earlier spins, and the history exists only so people can read what happened. That independence produces streaks that look wrong and are not. The chance that one particular face never appears in 6 rolls is (1 − 1/6) multiplied by itself 6 times, which this page computes as 33.5%. The chance that a named face comes up on two consecutive spins is 1/6 × 1/6, or 2.78%. On a d20 list the same arithmetic gives a 35.8% chance that a chosen face is absent from 20 rolls. None of that is the wheel "owing" anything; it is what independent uniform draws do, and a wheel that tried to even out a streak would be the biased one.

Eliminator mode: dealing the faces without repeats

Tick Eliminator mode and each spin removes the picked face instead of only announcing it. That turns the d6 into a dealer: 5 spins hand out 5 faces in random order and the last face left is the survivor, so 6 players get 6 distinct faces — seat order, turn order, who takes which colour — with no duplicate and no re-roll. Every elimination is a fresh uniform draw over the faces still on the wheel: 1/6 on the first spin, then 1/5, and so on down to 1/2 on the last. Because each face's chance of surviving to the end multiplies out to exactly 1/6, the survivor is no more or less likely to be any particular face than a single ordinary spin would be.

The engine's elimination states are immutable values, so a full run can be scripted and replayed at build time. Starting from the 6 faces and feeding the bytes 2, 0, 3, 1, 0 — the scripted source counts every byte the engine asks for, and the build confirms that each spin below consumed exactly one, so none of them hides a redraw:

  1. Spin 1: 6 faces remain, each at 1/6; byte 2 is accepted as index 2, removing face 3.
  2. Spin 2: 5 faces remain, each at 1/5; byte 0 is accepted as index 0, removing face 1.
  3. Spin 3: 4 faces remain, each at 1/4; byte 3 is accepted as index 3, removing face 6.
  4. Spin 4: 3 faces remain, each at 1/3; byte 1 is accepted as index 1, removing face 4.
  5. Spin 5: 2 faces remain, each at 1/2; byte 0 is accepted as index 0, removing face 2.

After spin 5 the state reports done, with face 5 as the survivor and the elimination order 3, 1, 6, 4, 2. Editing the list while an elimination is in progress restarts the elimination on the new list, and Reset list returns the preset faces. As with every spin, the bytes here are scripted for the page; a live elimination draws each byte from crypto.getRandomValues.

Duplicates and the dedupe switch

The wheel honours the list exactly as written, which means a repeated face is a second segment, not a typo the engine corrects. Type the 6 faces and then 6 once more, and the engine builds 7 segments: face 6 occupies 2 of them and wins with probability 2/7 — 28.57% — while every other face gets 14.29%. That is a loaded die, and the wheel will not stop you making one, because a list where two entries share a label is sometimes exactly what is meant ("Skip" twice on a house die). Tick Remove duplicate entries and the parser collapses repeats case-insensitively, first occurrence winning: the same input parses to 6 faces and the wheel is a fair d6 again. If a segment looks like a duplicate, the list is the place to check.

Sharing a die, keeping a die

Copy share link writes the current list into the page address as a #items= fragment, each face percent-encoded and joined with |. A d8 list becomes https://spinthatwheel.net/dice-wheel/#items=1|2|3|4|5|6|7|8; the house-dice list above becomes #items=Move%202%2C%20then%20roll%20again|Lose%20a%20turn|Swap%20places, 63 characters of encoded value that decode back to the same 3 faces, commas and all. Browsers do not include the fragment in web requests, so opening a share link rebuilds the wheel locally without sending the list to this site's server. The encoded value is capped at 1800 characters with an honest error rather than a truncated link, and a damaged link is reported as damaged. Between sessions, an edited list is saved in your browser's local storage on your device — spins and the history die with the tab, and Reset list restores the preset faces. You can check the privacy claim yourself: open the browser's network tab and spin; no request carries your faces.

Common misreadings

  • "It is due a 6." Nothing is due. Each spin is an independent 1/6 draw with no memory of the history list.
  • "It slowed down right past the 6, so it nearly landed there." The face was chosen before the wheel moved; the deceleration was calculated to end on the winner, so there is no "nearly". Reduced motion shows the same draw without the rotation.
  • "Pressing at the right moment changes the roll." The timing of the press, the wheel's resting position and the previous spin have no influence on the draw.
  • "A thin segment is less likely." On a d20 list every 18° sliver wins with the same 1/20 as any other; the drawing follows the draw.
  • "Two spins added is the same as a 2–12 wheel." It is not, and this wheel does not offer one: spin twice, add, and let the history keep both rolls.
  • "The wheel is a certified die." It is a fair randomizer for a table that trusts the screen it is watching — not an audited device, and the wrong tool for money-staked play.

Bigger ranges are the Number Wheel's territory — up to 1–100. The two-outcome classics are the Coin Flip Wheel and the Yes or No Wheel, and letters come from the Letter Wheel. For how the coin, dice and number wheels are the same draw over different lists, read Wheel versus coin versus dice; the full mechanism is on the methodology page, and the other write-ups are collected under guides.

Frequently asked questions

Is this exactly like rolling a physical d6?

Probabilistically, yes: each face has exactly 1/6 — 16.67%, computed at build time from the 6-face list. Physically, it is arguably fairer — no worn corners, no loaded suspicion, no dice rolling off the table into the dog. The 1-in-6 draw comes from rejection sampling over cryptographic random bytes, the standard technique for unbiased dice from raw randomness.

Can it roll two dice, or a d20?

One spin is one die. For 2d6, spin twice and add — the wheel’s history keeps both rolls visible. For other dice, edit the list (1–4 for a d4, 1–20 for a d20) or use the Number Wheel, which goes up to 100 and covers a d20 with two clicks. What this wheel will not do is pretend one spin of 2–12 equals 2d6 — the sums are not equally likely, and a single wheel would misrepresent that.

Why does 6 keep not showing up?

Each spin is an independent draw, so over 6 rolls the chance that one specific face never appears is (1 − 1/6) multiplied by itself 6 times — 33.5%, computed at build time — perfectly ordinary. Fair dice run cold and hot; only long-run frequencies even out. The wheel keeps no memory of what it "owes".

Is the animation deciding the roll?

Never. The face is drawn the instant you press Spin; the wheel then decelerates onto it. If your system prefers reduced motion, the animation is skipped entirely and the roll appears immediately — same draw, no theater.

How do I deal the faces out so nobody gets a repeat?

Tick Eliminator mode. Each spin then removes the picked face from the wheel: 5 spins hand out 5 distinct faces in random order and the last face left is the survivor, so 6 players receive 6 different faces with no re-roll — counts computed at build time by running the engine's eliminator over the 6-face list. Every elimination is a fresh uniform draw over the faces still on the wheel, and each face survives to the end with probability exactly 1/6. Editing the list mid-elimination restarts it.

What happens if a face appears twice in the list?

It becomes two segments. List the 6 faces plus 6 again and the engine builds 7 segments, 2 of them labelled 6, so that face wins 28.57% of spins while each other face wins 14.29% — a loaded die, by construction. Tick "Remove duplicate entries" and the parser collapses repeats case-insensitively (first occurrence wins), giving 6 faces and a fair d6 again.

What if I paste more faces than the wheel can hold?

The wheel holds at most 100 entries of up to 80 characters each. Paste 101 numbered lines and the engine returns this exact message instead of a wheel: "A wheel holds at most 100 entries — this list has 101. Remove some entries; nothing was silently dropped." Nothing is silently truncated.

Does a roll leave my browser?

No. The list is saved in your browser’s local storage on your device so it survives a reload; spins, results and the history exist only on the page and die with the tab. The only path a list takes off your machine is a share link you copy yourself, and browsers do not include the #items= fragment in web requests. Open the browser’s network tab and spin: no request carries your faces.

Game aid, not gaming device: fair for board games and classrooms, not certified for gambling. Rolls are drawn locally in your browser — see the methodology page.