Is the Wheel Really Random?
Short answer: no. Here is exactly how each winner is drawn, and a simulator to check the odds yourself.
Is the wheel rigged? The short answer
No, the wheel is not rigged. On LuckyWheel, the result is settled the moment you spin: your browser asks its cryptographic generator, crypto.getRandomValues, for a random number, and that number names the winner before anything moves. The animation then travels to a result that already exists, so a lucky flick, a well-timed Stop or a longer spin cannot change it.
Each slice takes up exactly as much of the wheel as its share of the odds, and no setting, visible or hidden, can force a winner. The draw runs in your browser, not on our server, with code anyone can inspect. Don’t just take our word for it: the calculator and the simulator below let you check the math.
How the winner is chosen, step by step
- Keep the entries in play. Only entries actually on the wheel take part: not hidden, not eliminated, with a weight above zero and, for prizes, some stock left.
- Turn weights into a scale. Each weight is multiplied by 100 and added to a running total. Weights of 1, 2 and 3 become the ranges 0–99, 100–299 and 300–599.
- Draw a secure number.
crypto.getRandomValuessupplies random numbers from your operating system’s secure generator. Rejection sampling, explained below, turns them into a whole number from 0 to 599 where every value is exactly as likely. - Find the winner. The entry whose range contains that number wins. A binary search finds it instantly, even among 5,000 entries.
- Plan the stop. A second draw picks where the pointer will land inside the winning slice, with a safety margin from both edges (15% of the slice width, at most 3°), so it never stops on a line. Extra turns are added at random: 6 to 8 for a 5-second spin.
- Animate. Only now does the wheel turn. The easing, the ticks and the suspense all end exactly on the planned angle.
Our automated tests replay 1,000 spins on wheels of 2 to 5,000 entries and check each time that the slice under the pointer is the entry that was drawn. With JavaScript turned off, the basic wheel draws on our server with PHP’s cryptographic random_int(), using the same weighted method.
Why the same name can come up twice
Repeats are the number one reason people suspect a wheel, yet they are exactly what fair randomness looks like. The wheel has no memory: with 10 equal entries, the name that just won still has a 10% chance on the next spin.
Over several spins, a repeat becomes likely rather than strange. It is the birthday paradox: with n equal entries and k spins, the chance of at least one repeat is 1 − n! / ((n − k)! × n^k). For 10 entries and 5 spins, that is 1 − (10 × 9 × 8 × 7 × 6) / 100,000, or 69.8%.
| Entries | Spins | Chance of a repeat |
|---|---|---|
| 10 | 3 | 28.0% |
| 10 | 5 | 69.8% |
| 20 | 5 | 41.9% |
| 30 | 10 | 81.5% |
| 100 | 10 | 37.2% |
The reverse surprises people too: 10 names need 29.3 spins on average before each one has come up once. If everyone must get a turn, use Elimination mode, as the random name picker does by default. Try your own numbers below.
Simulator: run 100,000 spins yourself
A handful of spins proves nothing; thousands do. This simulator spins a wheel 10,000, 100,000 or 1,000,000 times in the background, with the same random module as the real wheel. Use 2 to 100 equal entries, or your current wheel with its weights.
It charts each entry’s wins against the expected count, shows the largest gap and runs a chi-square test. On 10 entries and 100,000 spins, expect about 10,000 wins each, give or take a hundred or two. A p-value above 0.01 means the gaps look like ordinary chance; even a perfect generator dips below it once in 100 runs.
Weights and custom odds are always visible
Some draws need uneven chances: an extra ticket for a loyal customer, or a rare grand prize. Any entry can get a weight from 0.1 to 100, and its slice grows or shrinks in exact proportion. With weights of 1, 2 and 3, the slices measure 60°, 120° and 180°, for chances of 16.7%, 33.3% and 50%.
As soon as weights differ, every entry displays its percentage and the wheel is labeled with a “Custom odds” badge. Shared links carry the weights, and the certificate of the raffle generator states whether they were all equal, so nobody can hide an advantage.
What we will never do
- No rigged mode, forced winner or secret list, now or later.
- No hidden weights: any weight resizes its slice and shows a percentage.
- No result picked by our server when JavaScript is on: the draw runs in your browser.
- No
Math.randomin the drawing or shuffling code: our build check rejects it.
These promises belong to our public commitments, alongside a free service with no account.
The code behind the draw
The drawing logic fits in about twenty lines of JavaScript, in a file called rng.js that you can open from your browser’s developer tools. Its key ideas:
- No modulo bias.
randInt(n)setsconst limit = 0x100000000 - (0x100000000 % n);and draws again whenever a 32-bit value is at or above that limit. It is like choosing among 4 people with a 6-sided die: you re-roll a 5 or a 6 instead of giving it to someone. - Weighted pick.
pickWeighted()draws one number below the total and finds its owner by binary search. - Precise landing.
rand01()joins two 32-bit values into a number between 0 and 1 with 53 bits of precision. - Fair shuffles. The Shuffle button and the random team generator use a Fisher–Yates shuffle driven by
randInt, so every order is equally likely.
Frequently asked questions
Can an online wheel be rigged?
It can, on sites that hide weights, let a streamer edit an overlay, or pick the result on a server nobody can see. On LuckyWheel, every weight changes the size of its slice and shows as a percentage, there is no forced-winner option, and the draw runs in your browser with code anyone can inspect.
Why does the same name keep coming up?
Because the wheel has no memory. Each spin starts from scratch, so a name that just won keeps exactly the same chance as before. Repeats are also more frequent than intuition suggests: with 10 names and 5 spins, the chance of at least one repeat is 69.8%. Switch to Elimination mode if everyone must get a turn.
Does a harder swipe change the result?
No. The winner is drawn before the wheel starts moving. A fast flick only makes the spin last longer, from 3.5 to 9 seconds, and sets its direction, while a slow drag just turns the wheel without spinning it. With Manual stop enabled, pressing Stop shortens the slowdown toward the same stopping point, chosen in advance.
How can I prove a draw to participants?
Spin live, in full screen or on a shared screen, with equal weights so the “Custom odds” badge never appears. For giveaways, the raffle generator and the Instagram giveaway picker create a certificate with the date, settings and winners, plus a SHA-256 fingerprint of the entrant list, so anyone can check that nobody was added or removed afterwards.
Do you use Math.random?
Not for anything that decides a result. Math.random is not built to be unpredictable, and browser documentation warns against using it for anything sensitive. Draws, shuffles and stopping points all use crypto.getRandomValues. Math.random only adds visual noise to the confetti and the tick sound, and an automated check blocks it everywhere else.
Updated on by the LuckyWheel team