Draw whole numbers from any range using your device's cryptographic random source, with unique-values mode and the modulo bias rejected rather than ignored.
Most number pickers online call Math.random(), a fast pseudo-random function that the language specification itself declines to promise anything about, and which browsers document as unsuitable for anything security-adjacent. Random Number Generator draws from crypto.getRandomValues instead, the same source your password manager uses. Picking who brings the coffee, the difference never shows. Picking something another person has a reason to predict, it is the whole game.
A second problem is quieter and much more widespread. Taking a 32-bit random value and reducing it with % 100 is the obvious way to land inside a range, and it is slightly wrong: 4,294,967,296 does not divide evenly by 100, so the 96 leftover values at the top of the space wrap round onto the lowest outputs and make them fractionally more likely than the rest. This tool discards that tail and draws again.
Set a minimum, a maximum and how many you want. Five labelled quick ranges cover what people usually arrive for: a die, a coin, a percentage, a six-of-49 lottery line, PIN digits. No draw is sent anywhere or recorded anywhere.
Each number starts as one 32-bit value from crypto.getRandomValues. Before it is reduced into your range, it is checked against a cut-off: the largest exact multiple of the range size that fits inside 4,294,967,296. Anything at or above that line is thrown away and a fresh value drawn. For the die preset the discarded tail is 4 values wide, so a second attempt happens roughly once in a billion draws, and the outcome is exactly uniform rather than nearly so.
Unique mode changes strategy with density. Six numbers out of 49 are drawn by rejection, keeping a set of what has come up already, and that converges in a handful of tries. A thousand unique numbers out of a range of exactly a thousand cannot work that way: it is the coupon collector problem, where the final few values take thousands of attempts each. Past one eighth density the range is built as an array and put through a partial Fisher–Yates shuffle, which finishes in a single pass with no retry loop at all.
Raffles, team allocation, sampling rows out of a spreadsheet, dice replacement, picking a winner on a livestream: all fine, and the crypto source means nobody can argue the result was steered. Two cases are not fine. If you want key material, use a tool built for it rather than pasting integers together, because a key needs a defined length and encoding as much as it needs entropy. And if you are running a simulation you will need to reproduce, this is the wrong instrument entirely: there is no seed field, results are unrepeatable by design, and nothing about a draw survives you closing the tab. Regulated gaming draws have their own certification requirements that no browser tool meets.
Quick ranges
Set a range and press Generate. Every draw comes from your device’s cryptographic random source, not from Math.random().
Numbers come from crypto.getRandomValues, and the tail of the 32-bit range that would skew a plain modulo is discarded and redrawn rather than folded back in. Nothing is generated on a server, so no draw is logged anywhere and none of them can be reproduced after you leave the page — which is the point for a raffle, and a problem if you needed an audit trail.