When you press GO, the wheel spins for about a second and lands on a name. It feels like the physics of the spin — the speed, where you clicked, the frame rate — produced the winner. None of that is true. WheelMigo chooses the result first, then animates the wheel so it stops on the name that was already picked.
The selection step
Every eligible entry is one slot. To choose one, WheelMigo asks your browser's built-in crypto.getRandomValues API for a random number, then maps it onto the list of eligible entries using rejection sampling. Rejection sampling means that when a raw random value falls into the small leftover range that would bias the result toward the first few entries, that value is thrown away and a new one is drawn. The effect is a genuinely uniform choice: with eight eligible entries, each one has a 1-in-8 chance, with no rounding bias toward any position on the wheel.
crypto.getRandomValues is the same class of randomness browsers expose for security-sensitive work. It is not the predictable Math.random you may have seen in older scripts. That is deliberate: the point of a picker is that no one, including us, can nudge which entry the wheel lands on (you still choose who is eligible, but the draw among them is not something anyone can tilt).
Why the animation comes second
Once the entry is chosen, the wheel rotates to reveal it. The animation is presentation, not decision-making. This is why the Instant option can skip the spin entirely and still give you a valid result — there is nothing left to compute once the draw has happened. It also means you cannot influence the winner by flicking faster or clicking a particular spot.
Duplicates are kept on purpose
If your list has the same name twice, WheelMigo keeps both as separate slots. Two people can genuinely share a name, and collapsing them would quietly halve one person's chance. So a name that appears twice in a list of ten has two of the ten slots — that is the correct behaviour for a fair draw, not a bug.
What a browser wheel cannot promise
The bias a naive shortcut hides
The tempting one-liner is random % n — take a random number and divide by the number of entries, keeping the remainder. It looks uniform, but unless the random range is an exact multiple of n, the first few entries each get one extra chance. On a short list the skew is invisible; on a wheel that decides who wins, invisible is not good enough. Rejection sampling discards the values that would cause the skew, which is the whole reason WheelMigo uses it.
| Approach | Bias | Predictable? | Fair for a picker? |
|---|---|---|---|
| random integer % n (no rejection) | Slight, toward low entries | Historically seedable | No |
| crypto.getRandomValues + rejection sampling | None — uniform | No | Yes |
Honesty matters more than a reassuring badge, so here is the boundary. WheelMigo is a browser tool. It does not provide certified, auditable draws for regulated prizes or lotteries. Local result history and your device clock are convenient records, not independent certification, and a determined host or device operator cannot be proven incapable of interference by the app alone. For casual and classroom use — deciding who goes first, picking a name, settling a small choice — uniform selection from your list is exactly what you want. For anything with legal or financial stakes, use a service built and audited for that purpose.