How it works

1. Where the randomness comes from

Numbers are produced by crypto.getRandomValues(), the cryptographically secure generator built into your browser and seeded by the operating system. To keep every outcome equally likely we use rejection sampling instead of the modulo trick, which quietly favours the low end of a range. Multiple unique winners are picked with a Fisher–Yates shuffle driven by the same generator.

2. Sealing the draw

The draw name, range, settings, 256 bits of extra entropy, the drawn numbers and the moment of the draw are joined into one fixed-order string and hashed with SHA-256. That fingerprint changes completely if a single digit of the result is altered later.

3. The timestamp

The fingerprint is sent to our server, which reads its own UTC clock and returns SHA-256(fingerprint | serverTime). Because the server never sees your numbers, and the attestation only fits that exact fingerprint and that exact time, a result cannot be back-dated or swapped after the fact.

4. Publishing and checking

Copy the proof record and publish it alongside your winner announcement — on your live stream, post or results page. Entrants paste it into the verifier and the checks run in their own browser.

Honest limits

Random Certified proves a result has not been changed since it was attested, and that the numbers came from a sound generator. It cannot prove how many entries you had or that the entry list was complete — publish your entry list and ticket range alongside the record for a fully auditable draw. For draws requiring a regulated third party, use this alongside your licensing obligations.