Coverage field
Each square is one way two of your numbers could land in the draw. A wheel guarantees a hit only if every square is inside at least one ticket. The algorithm adds the ticket that claims the most still-empty squares, then repeats — so the field fills fast at first and crawls at the end. Squares a ticket re-covers (already claimed) flash violet: that overlap is the wasted coverage that makes the tail tickets worth so little.
The wheel · hover to highlight · click a row to drop a ticket
Reality check
The guarantee is conditional: it only pays out when enough of your numbers actually come up. This runs random draws from the full pool to show how often that happens — and confirms the guarantee never fails when it should hold. Drop tickets in the wheel (click a row) and re-run to see the guarantee degrade.
The maths behind this
▶
A wheel is a covering design
Throughout, v is how many numbers you wheel, k is how many the draw picks, and t is the match you want guaranteed. Each ticket is a k-subset of your v numbers. The wheel guarantees a t-match exactly when every t-subset of your v numbers sits inside at least one ticket. The smallest set of tickets with that property is the covering number C(v, k, t) — the object this whole page is built around.
Why covering every t-subset does the job: if the draw contains t of your numbers, those t form one of the subsets you've covered, so it lives inside some ticket — and that ticket therefore shares at least t numbers with the draw. That's the hit.
The guarantee is conditional
Read it as "t matches if t of your numbers are drawn". It only pays out when enough of your numbers actually come up; wheeling clusters your coverage so a partial hit lands as a payable line rather than scattering across near-misses, but it doesn't change the odds of the numbers themselves. The Reality check panel estimates how often the condition fires.
Schönheim minimum — the lower bound
The exact covering number is unknown for most parameter sets (computing it is NP-hard), so the page shows the Schönheim bound instead: a provable floor that no wheel can beat. Fix any one of your numbers. The tickets containing it must, on the other v−1 numbers, cover every (t−1)-subset — a smaller covering problem of the same kind. Counting tickets-through-a-point across all v numbers (each ticket gets counted k times, once per number it holds) gives the recursion:
L(v, k, t) = ⌈ (v / k) · L(v−1, k−1, t−1) ⌉, with L(v, k, 1) = ⌈ v / k ⌉
and C(v, k, t) ≥ L(v, k, t). When the built wheel equals this number, it's provably optimal; when it sits above, the gap is slack — either the heuristic is loose, or the true minimum genuinely exceeds the bound, or both.
The greedy builder
Since the true minimum is intractable in general, the wheel is constructed by a greedy heuristic. Each new ticket is seeded with a t-subset that's still uncovered — which guarantees the build always makes progress and terminates — and the remaining slots are filled one number at a time, each time adding the number that newly covers the most still-uncovered t-subsets. The whole thing runs several times from different random starts, keeping the smallest wheel found.
The output is always valid (every t-subset ends up covered — the build checks this) and is an upper bound on the minimum. So the real answer lives somewhere between the Schönheim line and the number shown. Because the restarts are randomised, each rebuild explores fresh ones, and the page keeps the best wheel found across all your builds for the current settings — so repeated rebuilds can only lower the count or leave it unchanged. For specific parameters, hand-optimised designs from the La Jolla Covering Repository will often beat a greedy solver.
Full wheel and “to cover”
"To cover" is C(v, t) — the number of t-subsets the wheel has to account for. "Full wheel" is C(v, k) — every possible ticket from your v numbers, which is what you'd buy at the extreme t = k (guarantee a full match whenever all your numbers are drawn). Cost is simply tickets × the per-line price.
Two independent pools
Games like EuroMillions draw a second pool (the Lucky Stars) independently of the main numbers. Independence means the result space and the guarantees multiply: a combined wheel is your main wheel × your bonus wheel, not the sum. Guaranteeing "3 main and 1 star" pairs every main ticket with every star ticket, so the line count explodes — which is why sensible wheeling stays within a single pool. The Main / Secondary toggle lets you cover either pool on its own.
The reality check
The simulation draws tens of thousands of random results from the full pool, counts how often at least t of your numbers appear (the condition for the guarantee to bite), and confirms the guarantee never fails when it should hold (zero, for a valid full wheel). It then reports two different things. Best single line per draw collapses each draw to your one highest-scoring ticket — useful for "what's the top tier I tend to reach", but it hides the fact that a good draw wins on many lines at once. Winning lines per draw fixes that: it averages, over all draws, how many of your lines land in each tier, so you can see that a single draw typically pays out across several lines — which is the whole economic point of a wheel.