gg
Home › Home › Reproducible Fair Draw
Home

Reproducible Fair Draw

Draw winners from a list of names in a way the people who were not in the room can check for themselves. You give the entries — one per line, with an optional number of tickets for anyone who should have more than one chance — and a seed: any short value your group has agreed on. The draw is worked out from those two things and nothing else, so the same list and the same seed always produce the same winners, in the same order. Publish the entry list and the seed before the draw, run it afterwards, and any member can re-run it and get your result back. The tool draws winners without replacement, will draw an ordered set of reserves for you (the first name out is so often the one who cannot come), and prints a verification block holding the exact list used, the entry count, the ticket total, the seed and the result. It is honest about its own limits: it runs on a small published generator rather than a strong one, nobody has certified it, and anyone who picks the seed after seeing the entries can keep trying seeds until they like the answer — which is why the seed has to be agreed first. Everything runs on your own device.

Try it now

Worked example

Reproducible Fair Draw Allotment plots — autumn draw This draw was worked out from the entry list and the seed printed below, and from nothing else. Anybody holding that list and that seed gets these same winners, in this same order, today or in ten years. That is the only thing being claimed for it. WHAT THIS IS NOT — READ THIS PART OUT - This is not a secure draw. It runs on a small, published generator, chosen so that anyone can re-run it by hand — not one built to stand up to somebody determined to steer the result. - Nobody has certified this and nobody has checked it. It is a piece of arithmetic run on your own device, and the club's confidence in it should rest on people re-running it, not on the tool. - The real weakness is the seed. Whoever chooses the seed after seeing the entry list can try one seed after another until a result they like comes up, and the result would still re-run perfectly for everybody else. No amount of arithmetic repairs that. - So fix the seed in public BEFORE the entry list closes: agree it at a meeting and put it in the minutes, or agree on a value nobody can steer that will only be published later. Announce the entry list and the seed first, draw second. A seed the organiser thought of afterwards proves nothing, however well the draw re-runs. - Picking a ticket by remainder makes tickets near the top of the list a hair more likely to come up than tickets near the bottom. On list sizes a club would ever use the difference is far too small to notice, but it is there and you should know about it rather than hear it from someone else. - If people pay to enter, what applies to that differs from place to place and changes over time. This tool knows nothing about it. Find out what applies to you before you run one. WINNERS (3) 1. Ravi Kapoor — 4 ticket(s) 2. Jonas Weber — 1 ticket(s) 3. Priya Raman — 3 ticket(s) RESERVES, IN ORDER (2) 1. Daniel Fisher — 1 ticket(s) 2. Grace Mbeki — 1 ticket(s) THE ENTRY LIST USED — 12 entr(ies), 23 ticket(s) in total 1. Priya Raman — 3 ticket(s) 2. Tom Okafor — 1 ticket(s) 3. Aisha Bello — 5 ticket(s) 4. Daniel Fisher — 1 ticket(s) 5. Mei-Ling Chan — 2 ticket(s) 6. Sofia Duarte — 1 ticket(s) 7. Jonas Weber — 1 ticket(s) 8. Hannah Ellis — 1 ticket(s) 9. Ravi Kapoor — 4 ticket(s) 10. Grace Mbeki — 1 ticket(s) 11. Oliver Nash — 2 ticket(s) 12. Elena Ricci — 1 ticket(s) VERIFICATION BLOCK — publish this whole block with the result Tool: fair-draw, method gg-network/fair-draw/v1 Draw: Allotment plots — autumn draw Entries: 12 Total tickets: 23 Entries able to be drawn: 12 Seed, exactly as used: "agreed-at-the-meeting-2026-09-05-4417" Seed fingerprint (SHA-256): 3ed3dede9c926a5ba7ced875b0a44f1b3630393ecbbda10eb7ff7384aa546890 Entry-list fingerprint (SHA-256): 57bac43e6d51eed589171f8370cd7d18b79ba0182c27f3dd17098e1a63110bfa Asked for: 3 winner(s), 2 reserve(s) Drawn: 3 winner(s), 2 reserve(s) Winners: 1. Ravi Kapoor 2. Jonas Weber 3. Priya Raman Reserves: 1. Daniel Fisher 2. Grace Mbeki Anyone can check this draw. Take the entry list printed above and confirm it is the list that was published. Take the seed and confirm it is the value that was agreed beforehand. Then run the same tool on the same list and the same seed: the winners must come out in the same order, name for name. If they do not, something in the list or the seed is not what was published. THE METHOD IN FULL, SO IT CAN BE RE-IMPLEMENTED 1. Each entry becomes one line, the name then a tab then the ticket count, in entry order, joined with newlines. The SHA-256 of that text, in lowercase hex, is the entry-list fingerprint below. 2. The generator key is "gg-network/fair-draw/v1", a newline, the entry-list fingerprint, a newline, then the seed exactly as printed below. 3. The first 16 hexadecimal characters of SHA-256(key), read as a 64-bit number, start a SplitMix64 generator. 4. To draw one name: add up the tickets of everyone still in, take the next 64-bit number from the generator, take the remainder on dividing by that total, then walk the entry list in order adding up tickets until the running total passes it. That entry is drawn and takes no further part. 5. Repeat for each winner, then for each reserve in order. Entries holding zero tickets are never in the pool.

Inputs

Frequently asked

What makes this checkable when a spreadsheet is not?

The result depends on two published things and nothing else: the entry list and the seed. Anybody can take those two things, run the same tool, and see whether the same names come out in the same order. A spreadsheet shuffle leaves nothing behind to re-run.

How do I give somebody more than one chance?

Put the number of tickets after a vertical bar: "Priya Raman | 3" gives that entry three chances, while a name on its own gets one. Tickets are whole numbers only — decimals are refused rather than rounded, because a draw that quietly rounded would be a draw nobody could check.

What should I use as a seed?

Something agreed in public before the entry list closes, and written down where everyone can see it — a number voted on at a meeting and recorded in the minutes, or a value nobody involved can steer that will only be published after the list has closed. The tool will offer you a value if you leave the seed empty, but that is the weakest option, because it came from the organiser's own screen.

What is the catch?

The seed. If the person running the draw picks the seed after seeing who entered, they can try seed after seed until a result they like comes up, and that result will still re-run perfectly for everyone else. The arithmetic cannot fix that; committing to the seed in advance can. The tool says so in its own output, every time.

Is this strong enough to stop someone cheating?

Not on its own. It runs on a small published generator, picked so that anybody can re-implement it, not one built to resist a determined attacker. Nobody has certified it and nobody has checked it. Its value is that a room full of members can reproduce the result, not that it is hard to break.

Can somebody be drawn twice?

No. Each name drawn is taken out of the pool before the next one, so winners and reserves are all different entries. If the same person is entered on two lines, though, those are two entries and both can come out — the tool tells you when names are repeated.

What if I ask for more winners than there are entries?

It says so plainly, tells you how many it could draw and how many it could not, and stops there. It never trims the number quietly to make it fit.

What about money?

This tool knows nothing about money and does no accounting. If people pay to enter, what applies to that differs from place to place and changes over time, so go and find out what applies where you are before running one.

Related Home tools