Random Number Wheel
Pick a min and max, spin for a whole number in that range, and optionally exclude numbers already drawn for bingo-style calling.
Press Draw a number.
How a number is drawn
Every whole number in range has exactly an equal chance: with a range of size R (max − min + 1), each number's probability is exactly 1/R. When numbers already drawn are excluded, R shrinks by one after every draw, and the same unbiased draw runs again over whatever remains.
result = candidates[randomInt(0, candidates.length − 1)]
Worked example
A default 1-20 range (20 numbers, 5.00% chance each to start), drawing 5 numbers with repeats excluded, using a fixed illustrative seed (your real draws above use live randomness):
| Draw # | Number | Odds at that draw |
|---|---|---|
| 1 | 14 | 1 in 20 |
| 2 | 1 | 1 in 19 |
| 3 | 4 | 1 in 18 |
| 4 | 3 | 1 in 17 |
| 5 | 17 | 1 in 16 |
Frequently Asked Questions
Why does the range switch from a wheel to a plain number above a certain size?
Above 24 numbers, a wheel's slices get too thin to letter clearly, so the tool draws straight from the range with the same unbiased engine and shows the result as a big number instead -- nothing about the fairness changes, only the visual.
What does "don't redraw a number already called" do?
It removes each drawn number from the pool of candidates for the next draw, so the range shrinks by one with every call -- exactly how bingo-style number calling or a raffle with several distinct prizes needs to work. Turn it off if you want every draw fully independent, repeats included.
Can the range include negative numbers?
Yes -- min and max just need to be whole numbers with max greater than min; a range like -10 to 10 works the same as 1 to 100.
Is this the same as JavaScript's Math.random() * (max - min) + min?
No, deliberately not -- that pattern has floating-point rounding quirks and, when floored to an integer, the same kind of subtle bias a naive modulo has. This tool draws an unbiased integer directly with rejection sampling over crypto.getRandomValues instead.
What happens when the whole range has been drawn?
With repeats excluded, the Draw button disables once every number in the range has been called -- press Reset to bring the full range back into play.
Every result here is drawn live in your browser with cryptographically-secure randomness -- nothing is predetermined, saved, or replayable. See the Terms.