How Namesome picks
The short version: your browser makes the pick with a cryptographic random number generator, before the wheel starts moving. Here is the long version, and how to check it.
Where the randomness comes from
Every pick starts with crypto.getRandomValues, the random number generator built into your browser and seeded by your operating system. It is the same source used to protect connections, not the arithmetic shortcut most animations use. The pick is made the moment you press Spin; the animation is a way of showing you a decision that has already been made, which is why nothing about the gesture — how hard you flick, how long you hold — can change it.
Weights change the chances on purpose, and the slices change width with them, so what people see matches what the draw does.
One exception, stated plainly: when a gift draw carries so many “must not draw” rules that random sampling cannot find a result that fits them, Namesome falls back to a shuffled solution built from the rules themselves. That result is a valid draw rather than a uniformly random one, and it is the only place on this site where those two differ.
Check it yourself
Run fifty thousand spins in this browser and compare what came out against a chi-squared test. Even wheels land inside the expected spread; weighted wheels land next to their weights. Nothing is sent anywhere — the audit runs on your machine.
Distribution audit
Test 2 gives the three entries weights of 1, 2 and 3: a slice three times the size comes up three times as often, and that is what its numbers measure.
How the audit works
Every pick takes 64 fresh bits from crypto.getRandomValues — the same generator a browser uses for keys — turns them into a number in [0, 1) and walks the entry weights until it lands. Nothing about the gesture, the timing or the animation touches the outcome: the name exists before the wheel starts moving.
Both tests are Pearson chi-squared goodness-of-fit tests. The statistic adds up (observed − expected)² ÷ expected across the entries, so a small number means the counts sit where an even picker would put them. Test 1 uses eight equally weighted entries: 7 degrees of freedom, critical value 24.322. Test 2 uses weights 1, 2 and 3, so the shares should be one sixth, one third and one half: 2 degrees of freedom, critical value 13.816. Both critical values are quoted at p = 0.001.
At that threshold a perfectly healthy picker still fails about one run in a thousand. One failure means run it again — two failures in a row mean a real bug.
Draws anyone can verify
When people need proof — who presents first, who's on the rota, which name came out of the hat — a draw record turns the pick into something a stranger can repeat. The record holds the entries, the settings, the seed and the fingerprints, and a button that recomputes the whole thing in front of you.
Commit, then reveal
Before the result exists, we publish a fingerprint: the SHA-256 of the secret seed, the entries and the draw ID. The result is derived from that seed afterwards, and the seed is published alongside it. Because the fingerprint was public first, we could not have drawn over and over until we liked the answer — the fingerprint would no longer match.
Commitment
46cc3578fe29c825a7134c9ba9b5b43d346147d11f2e5264f806f92b943b8b17Seed
49114b046bdfc2b0b62c1366dfc097dbb5d2aba0fe251e2c6c8516c4d44696f4ns-draw-v1, in ten lines
Entries are normalised and sorted, then hashed with SHA-256. The order is a Fisher-Yates shuffle driven by an HMAC-SHA256 stream keyed with the seed, and the picked names are the first names in that order. Same inputs, same output, on any machine, in any language.
// Excerpt of ns-draw-v1. sha256Hex, unhex and next32 are on the record page.
const entries = [...record.entries].map(s=>s.normalize('NFC')).sort();
const entriesHash = await sha256Hex(te.encode(JSON.stringify(entries)));
const commitment = await sha256Hex(te.encode(
record.seed + '|' + entriesHash + '|' + record.id));
const key = await crypto.subtle.importKey('raw', unhex(record.seed),
{name:'HMAC', hash:'SHA-256'}, false, ['sign']);
const arr = [...entries];
for (let i = arr.length-1; i > 0; i--){
const bound = i+1, lim = Math.floor(0x100000000/bound)*bound;
let r; do { r = await next32(); } while (r >= lim);
const j = r % bound; [arr[i],arr[j]] = [arr[j],arr[i]];
}
return { entriesHash, commitment, order: arr, winners: arr.slice(0, record.winners) };An excerpt — the helpers it calls, and the button that re-runs the whole thing in front of you, are on the draw record page.
What we never do
We never take money for a draw. There are no tickets, no entry fees, no prizes and no betting odds anywhere in Namesome, and the terms forbid using it for gambling. It picks names; that is the whole job.
Payment-blind by design — there is nothing here to point at money.
For agents and programs
The API and the MCP server return the same records with the same fingerprints, so one assistant can check another's draw. Every response carries the link to a page a person can read.