Random Number Generator
Pick a range, pick how many, press the button. Every number comes from your browser’s cryptographic random source — or from a seed you choose, when you need the same draw back.
About this draw
How it works
A range is not a continuous stretch; it is a finite set of reachable values. The range 1–45 holds 45 of them. The range 0–1 to two decimal places holds 101, because both ends are in it. This page draws one of those values rather than scaling a float and rounding afterwards — rounding at the end gives the two endpoints half the chance of every value between them, which is the most common silent bug in a random number generator.
The randomness comes from your browser’s `crypto.getRandomValues`, never `Math.random`. `Math.random` is a pseudo-random generator seeded from the system clock: the output looks fine, and anyone who knows roughly when it ran can narrow the result. For a prize draw that is the difference between "nobody can guess it" and "the organiser can".
Reducing a 32-bit random word to a range is also not simply `word % size`. That is biased: when 2³² is not a multiple of the range size, the values at the low end come up more often. This tool discards words that fall outside the largest exact multiple and draws again, so every number in the range is equally likely.
Drawing without repeats is not "draw again if it is a duplicate" either. That is fine for six numbers out of forty-five and quadratic for ninety out of a hundred — which is exactly when people reach for it. Here it is a Fisher-Yates shuffle run for only as many steps as numbers requested, so 900 out of 1,000 costs the same per number as one out of ten, and every ordering stays equally likely.
The seed field swaps the source for a deterministic generator derived from the text you type. The same seed with the same settings always produces the same numbers, on any machine at any time — which is what turns a random result into something another person can check. The trade is that a seeded draw is predictable to anyone who knows the seed, so it is never the right tool for anything that has to stay secret.
Formula
possible values = (to − from) × 10^(decimal places) + 1
The +1 is because both endpoints are in the range. 1–6 holds six values, not five, which is why a die has six faces.
Worked example
Drawing 6 numbers from 1–45 with no repeats:
- Possible values
- (45 − 1) × 1 + 1 = 45
- Distinct sets of six
- C(45,6) = 8,145,060
- Chance of any one set
- 1 in 8,145,060
- Shuffle steps performed
- 6, not 45
Add a seed — the name of the draw and its date, say — and anyone who opens the page with those settings gets these same six numbers: evidence that the result was not changed after it was announced.
Frequently asked questions
Are these numbers really random?
With the seed field empty, yes: the source is `crypto.getRandomValues`, the same source your browser uses for cryptographic keys, and nobody can predict it. With a seed, the result is deterministic — still uniformly distributed, but reproducible by anyone who knows the seed. That is the trade you make on purpose when you want the draw to be checkable.
What is a seed for?
So somebody else can get your result back. Publish the seed and the settings before the draw, and anyone can run it themselves and see the same numbers — no trust in you required. The "Share these settings" button builds a link that already carries the range, the count and the seed.
Are the endpoints included?
Yes. A 1–10 range can return both 1 and 10, each with the same one-in-ten chance as the eight numbers between them. The "Possible values" figure in the statistics is the quick check: 1–10 should read 10, not 9.
How many numbers can I draw at once?
1,000 per draw, anywhere between −1,000,000,000 and 1,000,000,000. If "no number twice" is ticked and the range does not hold that many distinct values, the count drops to how many it does hold and the page says so, rather than quietly returning fewer.
Why did my decimal places get reduced?
Because the range is too wide for that much precision. A billion-wide range at six decimal places is 10¹⁵ distinct values, more than the sampler can address. The range is what you asked for, so it is kept; the trailing digits are what gives, and the page tells you when it happens.
Why does the copied result use a dot for decimals?
Because that list is usually pasted into a spreadsheet, a message or some code, and every one of those reads "1.234,5" as something else. Both the numbers on screen and the copied text use a plain dot and no thousands separator, so they mean the same thing wherever they land.
Can I use this to generate a password or an OTP?
Better not to. The unseeded source is strong enough, but a string of digits is still a weak password, and a seeded one can be regenerated by anyone who learns the seed. For a password, use the password generator — it has the full character sets and an entropy figure so you know what you are holding.
Do the numbers leave my device?
No. Everything runs in your browser. The history of earlier draws lives in the page’s memory only — reload and it is gone, and nothing is written to your device or sent anywhere.