Random Number Generators: What "Truly Random" Means in Practice

Most random number generators are not really random. They are pseudo-random — predictable algorithms that look random unless you peek under the hood. For everyday decisions the difference is invisible. For raffles, security, or any setting where someone might dispute the result, it matters. This guide explains the difference plainly and shows when a wheel-based picker is the better tool for groups.

What "random" actually means in software

There are two flavours of randomness in computing, and they live on opposite ends of a spectrum. At one end is pseudo-random — a deterministic algorithm that takes a seed and produces a long sequence that passes statistical tests for randomness. Give it the same seed and you get the same sequence; the "randomness" is in the unpredictability of the seed, not the algorithm.

At the other end is truly random — derived from physical entropy, like atmospheric noise, radioactive decay, or thermal noise inside a chip. These cannot be reproduced even with the same starting conditions, because the universe never quite hands you the same starting conditions twice.

Between the two sits crypto-secure pseudo-random, which is what browsers and operating systems give you via APIs like crypto.getRandomValues. It is technically deterministic, but the seed comes from physical entropy and the algorithm is hardened against attacks. For everything short of national-security cryptography, it is indistinguishable from truly random in practice.

When you actually need truly random

The honest answer is: rarely, in everyday use. Three categories where the distinction matters enough to care.

Public raffles where the result is auditable. Lotteries, civic processes, big-prize giveaways. Here the perception of fairness matters as much as the actual math, and using a source like random.org with its atmospheric-noise entropy gives you a defensible answer when someone asks "are you sure that was random?"

Cryptographic operations. Security tokens, password reset links, encryption keys, session IDs. For these, do not pick a wheel or write your own randomiser — use the library that ships with your platform's crypto module. The stakes are real and the failure modes are silent.

Scientific sampling and simulation. Monte Carlo methods, randomised trials, statistical bootstrapping. Pseudo-random is usually fine here because researchers care about reproducibility (running the experiment twice with the same seed), but the entropy source for the seed should be solid.

When pseudo-random is fine (which is most of the time)

For 99% of the moments where you think "I need a random number", pseudo-random is fine. The list is short and recognisable.

  • Picking a name out of a meeting list. The meeting will not be audited.
  • Rolling dice during a board game. The other players will not run statistical tests.
  • Choosing tonight's dinner from a list of restaurants. Even if the algorithm were slightly biased, nobody would notice.
  • Assigning lab partners in a classroom. The fairness comes from the visibility of the wheel, not from the underlying entropy source.
  • Splitting a small bill. If anyone is paying close enough attention to mistrust the randomiser, the bill is too small to care about.

How the Spingiro random number picker is built

Under the hood, the Spingiro picker uses crypto.getRandomValues — the same primitive your browser uses for security operations. Each number has exactly its declared probability, with rejection sampling to avoid the modulo bias that older Math.random implementations introduced.

Practically, the picker covers the two modes people actually want. Range mode picks a number between a min and a max (1-100, 1-1000, etc.) — useful for raffles where each entry has a number. Digits mode picks N independent digits (e.g. a 4-digit code), useful for nonce-style values where you want each position independent.

For groups, the wheel format adds something the raw number does not: a visible result. "The wheel landed on 47" is psychologically different from "the API returned 47", even when the math is identical. Watch the spin and the audience accepts the number; show only the number and they wonder.

Try the random number picker

Spingiro vs random.org: an honest comparison

Random.org is the reference site for true randomness on the web. Their generator uses atmospheric noise from radio receivers, and they publish certificates and statistical analyses. If your raffle is going to be challenged in court, use them.

For everything else, the trade-off is convenience vs theatre. Random.org returns a number and a certificate; Spingiro returns a number with an animated wheel that everyone in the room can watch land. For a giveaway streamed to followers, the wheel format wins — fairness is what your audience sees, not what an audit certificate says. For a notarised commercial sweepstakes, the certificate wins.

There is no shame in using both. Some accounts run their public giveaway as a Spingiro spin for the visual, then re-verify with random.org for the receipt. The audience sees the spin; the lawyer sees the certificate.

A wheel vs a raw number, and why the format matters

A raw number is information. A spinning wheel that lands on that number is information plus social proof. When you are deciding by yourself, the raw number is enough. When you are deciding in front of other people, the format does a job the math cannot.

The shareable URL is the other piece worth knowing. Spingiro wheels encode their state in the URL — the same link loads the same list of entries on any device. For a raffle, you can post the URL of the loaded wheel before the spin, then the recording of the spin afterwards. Anyone can verify the list matched the entries.

Trust at that level is not free — for very large entries (a thousand-name raffle, for example) the wheel becomes visually unreadable. At that scale, switch to range mode or the number picker and let the audience verify the entry list separately.

Open the number picker

Edge cases that trip people up

Three small traps that turn a fine random number generator into the wrong tool.

Excluding numbers. "Pick 1-100 except for the winners of the last three weeks." Most pickers do not support exclusion natively; you either re-roll until you get a clean number (fine for a few exclusions, terrible for many) or generate from a custom list with the exclusions already removed.

Repeats vs without-replacement. Picking 3 numbers from 1-10 with replacement (each pick independent) is different from picking 3 without replacement (each pick removes its number from the pool). The default of most generators is with replacement; if you need a lottery-style draw, switch to elimination mode on the wheel or generate the picks one at a time excluding the previous results.

Large ranges. A range of 1 to a million is fine mathematically, but the wheel UI cannot render a million segments. At that scale, accept that there is no visual fairness — the audience has to trust the underlying RNG. Use a generator that documents its source (random.org or a documented crypto API) and link to the documentation in your raffle post.

Frequently asked questions

  • Is random.org safer than a digital wheel for raffles?

    For raffles where the result might be audited or challenged, yes — random.org has been the reference for true randomness for over twenty years and publishes certificates per draw. For everyday raffles (Instagram giveaways, office secret-santa, classroom picks), the difference is invisible and the wheel format wins on transparency to the live audience.

  • Can I use this for password generation?

    No. Use a password manager. They generate passwords with crypto.getRandomValues internally, with the additional logic (length, character classes, no dictionary words) that a number picker does not have. A picker is the wrong abstraction for credentials — switch tools, do not adapt this one.

  • What is the most random number from 1-10?

    Mathematically, all ten are equally likely. Psychologically, 7 is the number people pick most often when asked to choose a random number — which means in a survey of human guesses, 7 is the LEAST random. The point is that the question is meaningless for a real randomiser; the wheel does not care which number 'feels' random.

  • Can I exclude certain numbers from the wheel?

    In the Spingiro picker, yes — switch from range mode to list mode and paste only the numbers you want included. The wheel picks among the list, so exclusion is implicit. For very large ranges with a few exclusions, build the list with a small script (or paste 1-100 minus the excluded ones) and load the URL.

  • Does the wheel show the same result if I refresh?

    No. Each spin uses a fresh call to the RNG, so refreshing the page and spinning again gives an independent result. The wheel state in the URL preserves the list of entries and the configuration; it does not preserve the result of the last spin.

  • Is "Math.random()" good enough for a giveaway?

    For a small casual giveaway, yes — Math.random has modulo bias if you implement the range conversion sloppily, but for picking one winner out of a few hundred entries, the bias is invisible. For anything you might need to defend (commercial sweepstakes, prize over a few hundred dollars), upgrade to crypto.getRandomValues. The Spingiro picker uses it by default so the question does not come up.

Read more