WheelMigo

How WheelMigo actually picks a name

One click, one winner — but not the way it looks. The spin is a reveal, not the decision.

Quick answer

WheelMigo chooses the winning entry before the wheel starts moving, using your browser's built-in crypto.getRandomValues with rejection sampling so every eligible entry has an equal, unbiased chance. The animation only reveals a result that is already fixed — you cannot influence it by how fast or where you spin. It is fair for casual and classroom use, but it is not a certified draw for regulated prizes.

Key points

  • The winner is chosen before the wheel animates; the spin only reveals it.
  • Selection uses the browser's crypto.getRandomValues with rejection sampling, so the pick is uniform and unbiased.
  • Duplicate names are kept as separate entries, so shared names each get a fair chance.
  • It is fair for casual and classroom use, but not a certified draw for regulated prizes.

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.

ApproachBiasPredictable?Fair for a picker?
random integer % n (no rejection)Slight, toward low entriesHistorically seedableNo
crypto.getRandomValues + rejection samplingNone — uniformNoYes

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.

How this works

The selection logic runs entirely in your browser. For each draw, WheelMigo requests random bytes from crypto.getRandomValues, discards any value that would fall outside a whole multiple of the current entry count (rejection sampling), and maps the remainder to an entry index. This removes the modulo bias that a naive random % n would introduce. There is no server call and no stored seed, and you can confirm the behaviour yourself: spin speed, click position and timing never change the result.

Frequently asked questions

Is an online wheel spinner really random?
WheelMigo uses the browser's cryptographic random source (crypto.getRandomValues) with rejection sampling, which gives every eligible entry an equal chance. That is as close to uniform as a browser can offer — but for legally regulated draws you still need an audited, certified service, not any web page.
Can I influence where the wheel stops?
No. The winner is selected before the wheel moves, so spin speed, click position and timing have no effect on the result. The animation only reveals the choice that was already made.
Why did the wheel pick the same name twice in a row?
In normal mode each spin is independent, so repeats are expected and fair. If you want everyone chosen once before anyone repeats, turn on "No repeats this round."
Should I use WheelMigo for a prize giveaway?
For casual, low-stakes giveaways it is fine. For anything with legal or financial consequences, use a service specifically built and audited for certified random draws.

References

  1. MDN — Crypto.getRandomValues()
  2. Wikipedia — Rejection sampling

← All articles