Decision Wheel
Let the wheel decide for you, say goodbye to indecision
No records yet — give it a spin!
What is a Decision Wheel?
The Decision Wheel randomly selects one option from a list and turns a small choice into a visible, shared process. Common contexts include classrooms, team activities, choosing food, presentation order, lightweight giveaways, brainstorming, and situations where several options are roughly acceptable. Its value is reducing decision fatigue and making the selection feel transparent. It should not replace judgment when options carry different risks, costs, fairness concerns, or responsibilities. For serious drawings, participant lists, weighting, exclusions, and record-keeping should be defined before spinning so the outcome remains explainable. The wheel is best for low-stakes decisions where randomness is acceptable and everyone understands the rules.
How to Use
How to use
- Enter an option name in the input box, press Enter or click Add
- Add multiple options (up to 15), each option max 20 characters
- Click the center 'SPIN' button, the wheel starts spinning
- Wait for the wheel to stop, see the randomly selected result
Fairness Tips
- Keep options short and comparable so the wheel is easy for everyone to read before it spins.
- For important decisions, agree on the option list before spinning and avoid changing entries after seeing an unfavorable result.
Use Cases
Technical Principle
The wheel is a Canvas 2D drawing layered with a deterministic random pick. Each slice is rendered with ctx.beginPath(); ctx.moveTo(cx, cy); ctx.arc(cx, cy, r, startAngle, endAngle); ctx.fill() where N equal options take an arc of 2π/N radians each — fifteen slices is therefore 24° of arc apiece, which is also why the input is capped at 15 to keep labels readable. The winning slice is decided BEFORE the animation: a 32-bit unsigned integer is drawn with crypto.getRandomValues(new Uint32Array(1))[0], reduced modulo N, and that integer is the answer. The animation then computes a target rotation of fullSpins × 2π + (2π − winnerIndex × sliceAngle − sliceAngle/2) so the pointer at the top of the canvas ends up aimed at the centre of the chosen slice, and tweens to it inside requestAnimationFrame using an easing curve such as easeOutCubic, f(t) = 1 − (1−t)³, or easeOutBack for the small overshoot that mimics a physical wheel slowing down. crypto.getRandomValues is the Web Crypto CSPRNG (specified in the Web Crypto API), seeded from the OS entropy pool, so unlike Math.random the pick cannot be predicted by reading the page's state. Weighted variants build a cumulative-probability array of length N and binary-search the random draw across it in O(log N). Outputs are entirely visual and ephemeral — nothing is logged, so any audit trail (timestamp, option list, screenshot) must be captured externally before the page is refreshed.
- Canvas rendering: each slice is ctx.arc(cx, cy, r, startAngle, endAngle) with sliceAngle = 2π / N — 15 options gives 24° per slice, which is the practical readability ceiling
- Winner selection uses crypto.getRandomValues(new Uint32Array(1))[0] % N — Web Crypto CSPRNG, seeded from OS entropy, suitable for fair single-shot draws but NOT for replayable lotteries (no audit trail)
- Animation runs in requestAnimationFrame at the display refresh rate (typically 60 Hz) with easeOutCubic f(t) = 1 − (1−t)³ or easeOutBack for a slight overshoot — the curve is cosmetic, the winner is already chosen
- Final rotation is targetRotation = fullSpins × 2π + (2π − winnerIndex × sliceAngle − sliceAngle/2) so the top-pointer lands on the slice centre, not its edge
- Weighted-options mode builds a prefix-sum array of weights and uses binary search to map a uniform random number to a slice in O(log N) — equivalent to inverse-CDF sampling
- Modulo bias is negligible when N ≤ 15 and the draw is 2³² values wide (bias ≈ N / (2 × 2³²) ≈ 1.7×10⁻⁹), so no rejection-sampling loop is needed
- Each spin is i.i.d. — consecutive spins can repeat the same option and that is correct uniform behaviour, not a bug; deduplication across spins requires an external record
Examples
Lunch Decision
Options: Pizza, Sushi, Burgers, Tacos, Salad → Spin → Result: SushiTeam Activity
Options: Bowling, Karaoke, Escape Room, Mini Golf → Spin → Result: Escape RoomMovie Night
Options: Action, Comedy, Horror, Romance, Sci-Fi → Spin → Result: ComedyFAQ
Is the wheel spin actually random?
Yes. The selected segment is chosen by crypto.getRandomValues, then the wheel animates to land on it. The visual spin is just for theater - the result is decided up front. Each spin is independent of past spins.
Are all segments equally likely?
Yes. Each option gets an equal-sized slice and each slice has equal probability. There is no weighted or biased mode - all options have the same chance of being selected.
Does the spin animation affect the outcome?
No. The animation is decorative - the result is computed first, then the wheel rotates to show it. Even if you stop the animation early, the chosen segment is the same.
Can I save the wheel between sessions?
No. Options are kept only during the current session. Closing the tab or refreshing loses the list. Copy your options before closing if you need to reuse them.
Should I use it to make important decisions?
Use it for low-stakes group choices (lunch, presentation order, draft picks) where any option is acceptable and visible randomness avoids hard-feelings. Don't outsource decisions where consequences differ significantly between options - the wheel can't weigh trade-offs.
Why does it sometimes pick the same option twice in a row?
Each spin is independent. With three options, the probability of two same-option spins in a row is 1/3 ≈ 33%. With ten options, it's 10%. Repetition feels strange but is mathematically expected in genuine random selection.
Is my option list uploaded?
No. The wheel runs entirely in your browser. Options are saved locally if you opt in; nothing is transmitted.