# Fairness and Randomness Audit - SpinTheList

Every spin on SpinTheList is decided by the browser's cryptographically secure random number generator. This page explains the method and lets you verify it yourself.

## How a winner is picked

1. When you click Spin, the wheel calls `crypto.getRandomValues()` for one 32-bit random integer.
2. That integer is divided by 2^32 to get a number between 0 and 1, then multiplied by the number of slices to choose the winning index.
3. Only then does the animation start. It is timed to land on the slice already chosen; the spin you watch is a replay of the draw, not the draw itself.
4. Nothing leaves your browser. There is no server, account, or setting that can bias the result.

## Why crypto.getRandomValues beats Math.random

`Math.random()` is a pseudo-random generator that is fine for animations but was never designed to be unpredictable. `crypto.getRandomValues()` is the Web Crypto API: it draws from the operating system's entropy pool, the same source used for encryption keys, so every value is uniformly distributed and independent of earlier spins.

## Weighted entries

Weights are off by default. When enabled, `Alice:3` counts as three tickets. The wheel draws one random number between 0 and the total weight and walks down the list subtracting each weight until it crosses zero. An entry's chance is its weight divided by the sum of all weights.

## Remove after spin

Each winner leaves the wheel before the next draw, so ten names start at 10% each, then 1 in 9, 1 in 8, and so on. Every entry wins exactly once across a full run, which is how Spin All produces a fair random ranking. The same generator drives the Shuffle button, bracket seeding, and auto-decided bracket matchups; only cosmetic effects use Math.random.

## How the spread shrinks with more spins

A fair wheel produces counts that wobble around the expected value, and the wobble shrinks with the square root of the spin count: every 10x more spins makes the spread about 3.2x tighter. Measured with the wheel's own selection function on 8 equal slices, 20 runs per size:

| Spins | Typical slice deviation | Worst slice deviation | Theory (1 sd) |
|---|---|---|---|
| 100 | 22.6% | 47.6% | 26.5% |
| 1,000 | 6.7% | 15.1% | 8.4% |
| 10,000 | 2.2% | 5.1% | 2.6% |
| 100,000 | 0.74% | 1.56% | 0.84% |
| 1,000,000 | 0.20% | 0.46% | 0.26% |

After 1,000 spins one slice is usually about 15% behind, which is normal. After 100,000 spins every slice sits within about 1.5% of target. A biased generator would sit above the theoretical line and stay there as spins increase.

## Run your own audit

Open [spinthelist.com/fairness](https://spinthelist.com/fairness), choose 2 to 20 slices and 1,000 to 1,000,000 spins, then click Run audit. The page runs the exact selection function the wheel uses and shows a table of wins, expected wins, and deviation per slice, plus a histogram. Deviations shrink as the spin count grows; small variation is expected and is itself a sign of genuine randomness.

## Frequently Asked Questions

### Is the SpinTheList wheel truly random?

Yes. Every spin calls crypto.getRandomValues(), the browser's cryptographically secure random number generator, to choose the winning slice. The animation is only a visual replay of that result. Nothing on the page can nudge the outcome, and you can verify the distribution yourself with the audit on this page.

### Why not just use Math.random()?

Math.random() is a fast pseudo-random generator that is fine for games but is not designed to be unpredictable, and older engines had visible patterns. crypto.getRandomValues() draws from the operating system's entropy source, the same one used for encryption keys, so its output is unbiased and cannot be predicted from earlier spins.

### Can the site owner or anyone else rig a spin?

No. SpinTheList is a fully static site with no server-side logic for spins. The random number is generated inside your browser, and there is no account, login, or hidden setting that could favor an entry. Weighted entries are the only way to change odds, and they are visible in the list as Name:number.

### How do weighted entries change the odds?

With weights off, every slice has an equal chance. When you turn weights on and write Alice:3, Alice gets three tickets in the draw while everyone else gets one, so her chance is 3 divided by the total weight. The wheel draws one random number between 0 and the total weight, then walks the list to find the winner.

### What does remove-after-spin do to the probabilities?

Each winner is removed before the next spin, so the remaining entries share the odds equally. With 10 names the first spin gives each 10%, the next 1 in 9, then 1 in 8, and so on. Over a full run every name is picked exactly once, which is why Spin All produces a fair random ranking.

### How many spins do I need before the results look even?

Deviation shrinks with the square root of the spin count, so every 10x more spins makes the spread about 3.2x tighter. With 8 slices, a 1,000 spin run typically shows slices 5 to 15 percent off their expected count, 10,000 spins brings that to 2 to 5 percent, 100,000 to under 2 percent, and 1,000,000 to under half a percent. The wheel is equally fair at every size; small runs simply have not had time to average out.

### Why do the audit results not show exactly equal counts?

Perfectly equal counts would actually be suspicious. Random draws naturally vary by roughly the square root of the expected count. With 100,000 spins over 8 slices you expect 12,500 wins each, give or take a few hundred, so deviations under about 2 percent are normal and shrink as you add more spins.

---

Spin a fair wheel free at [SpinTheList.com](https://spinthelist.com)