Spin the wheel
Paste up to 1,000 entries, add weights and go full screen.
Fairness
Every ChalkSpin spin is decided the moment you press Spin by your browser's cryptographic random number generator (crypto.getRandomValues). The wheel then animates to that result, every slice is drawn to its exact share of the odds, and there is no hidden setting that can rig the outcome.
crypto.getRandomValues, in your browserFive steps, all inside your browser, in a few milliseconds:
ChalkSpin uses crypto.getRandomValues, part of the Web Crypto standard that every modern browser supports. It's a cryptographically secure random number generator, seeded by your device's operating system from unpredictable physical events. Browsers use the same source to create security keys, so it's built to be impossible to guess.
Many simple spinners use Math.random() instead. That's fine for games, but it isn't designed to be unpredictable: its sequence can be worked out from a handful of earlier results. ChalkSpin never uses it to decide anything.
Strictly, both are "pseudo-random": computed rather than measured from nature. For a cryptographic generator the difference can't be detected, which is why banks and browsers trust it, and why it's more than fair enough for choosing who reads next.
The generator hands out random 32-bit numbers: one of 4,294,967,296 equally likely values. To turn that into a pick from 30 names, the obvious move is to take the remainder after dividing by 30. But 4,294,967,296 isn't a multiple of 30. It leaves 16 values over, so 16 of the names would get one extra chance in 4.3 billion. Tiny, but not equal.
ChalkSpin removes that bias completely with rejection sampling: if the number lands in the leftover range at the very top, it's thrown away and a new one is drawn. For 30 names that happens about once in 268 million draws, and every name ends up with exactly the same chance. This is the code every ChalkSpin tool uses:
/** Fair integer in [0, n): rejection sampling, so there is no modulo bias. */
export function randInt(n) {
const limit = Math.floor(4294967296 / n) * n;
const u = new Uint32Array(1);
do crypto.getRandomValues(u);
while (u[0] >= limit);
return u[0] % n;
}On ChalkSpin the picture is the probability. Each slice's angle is its entry's weight divided by the total weight, times 360°, and the pick uses the same numbers. What the class sees on the board is exactly the chance each name has.
| Entry | Weight | Slice | Chance |
|---|---|---|---|
| Maya | ×1 | 72° | 20% |
| Jonah | ×2 | 144° | 40% |
| Ava | ×1 | 72° | 20% |
| Leo | ×1 | 72° | 20% |
The only ways to change the odds are ones the room can see: giving an entry a weight, adding the same name twice (ChalkSpin flags duplicates), or removing a name, for example a student who's absent today.
Don't take our word for it. This spins a small wheel thousands of times right now, in your browser, with the same function the real wheel uses. Change a weight and watch that name's share follow its slice.
| Entry | Weight | Share chart | Wins | Observed | Expected |
|---|---|---|---|---|---|
| Maya | ×1 | – | – | 20.0% | |
| Jonah | ×2 | – | – | 40.0% | |
| Ava | ×1 | – | – | 20.0% | |
| Leo | ×1 | – | – | 20.0% |
Press Run the test to spin this wheel thousands of times in your browser.
Each spin is independent: the wheel doesn't remember who won last time, the same way a coin doesn't. So repeats are normal, and they happen more often than most people expect.
If you want everyone to have a turn before anyone goes again, switch on Remove winner: each winner leaves the wheel after their spin (and Undo brings them back). The random name picker is built around the same idea: no repeats until everyone has had a turn.
Instant result skips the animation and shows the winner straight away. It uses exactly the same draw, so the odds don't change. If your device is set to reduce motion, ChalkSpin shows results instantly on its own and turns off the celebrations.
Every ChalkSpin tool builds on the same three functions: a fair whole number, a fair weighted pick, and a fair shuffle.
Yes, in every way that matters for a classroom. Each spin uses crypto.getRandomValues, the cryptographically secure random number generator built into your browser and seeded by your device's operating system. Nobody, including ChalkSpin, can predict or steer the result.
No. There is no hidden setting, secret weight or 'next winner' option. The only things that change the odds are visible to everyone: an entry's weight (its slice gets wider), duplicate entries (ChalkSpin flags them) and removing names. Anyone who opens the share link sees exactly the same entries and weights.
No. The winner is chosen the instant you press Spin, before the wheel starts to move. Spin length, the number of turns, the theme, sounds and confetti only change how the result is shown.
Because every spin is independent, repeats are normal. With 25 names there is a 1 in 25 (4%) chance that the next spin picks the same name again, and across 10 spins there is about an 88% chance that at least one name comes up twice. Turn on Remove winner if you want everyone to get a turn before anyone repeats.
A weight multiplies an entry's chance. Type *2 after a name (for example 'Maya *2') or use the weight buttons, and that entry gets a slice twice as wide and exactly twice the chance. Each entry's chance is its weight divided by the total weight, which is the same as its share of the wheel.
No. The draw runs entirely in your browser; no request is sent to choose a winner. Your list stays in your browser unless you save it to an account, and share links carry the entries after the # in the link, which browsers never send to a server.
No. Instant result uses exactly the same draw and simply skips the animation. ChalkSpin switches it on automatically when your device asks for reduced motion.
It uses the same cryptographic generator as the wheel. Every whole number in your range has exactly the same chance, because ChalkSpin uses rejection sampling to remove modulo bias, and the no-repeats mode never draws a number twice until you reset.