Original research
Spin Wheel Fairness Study
Last updated:
We ran 100,000 automated spins on equal-size wheel slices using the same landing-angle geometry as our live spin wheel. 8 of 10 configurations passed a chi-square test for uniform distribution at α = 0.05; see the tables below for the exception, consistent with that test's own 5% false-positive rate rather than a sign of bias. Download the CSV to cite or reproduce the results.
Summary
- Total spins: 100,000
- Spins per segment count: 10,000
- Segment counts tested: 2, 3, 4, 6, 8, 10, 12, 16, 20, 36
- Method: Node crypto.randomInt landing angle (build-time simulation, mirrors the browser's crypto.getRandomValues()) → getCurrentSegment geometry
- Uniformity result: See tables below
- Data as of: 2026-10-17
The CSV has one row per slice per segment-count configuration (117 rows total), each with the observed count out of 10,000 spins for that configuration. It is not a row-by-row log of all 100,000 individual spins.
Methodology
For each segment count k, we simulated 10,000 independent spins. This simulation runs in Node at build time, so each spin drew its landing angle from Node's cryptographically secure random generator (crypto.randomInt), the server-side equivalent of the browser's crypto.getRandomValues() used in production, then mapped the angle to a slice index using the same equal-arc formula as the live wheel (pointer on the right).
Expected count per slice is n/k. We computed Pearson's chi-square statistic χ² = Σ(O−E)²/E with k−1 degrees of freedom and compared to the α = 0.05 critical value. Configurations with χ² ≤ critical value are consistent with a uniform distribution.
This study does not cover weighted slices, removed entries mid-session, or human timing, only equal segments and cryptographic landing angles.
This simulation evaluates the random-selection and landing-angle model used by the wheel; it does not measure physical-wheel effects such as friction or pointer mechanics.
2 segments, 10,000 spins
χ² = 13.8384 (df = 1, critical 0.05 = 3.841), review needed · max deviation 3.72%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 5186 | 5000 | 3.72% |
| 1 | 4814 | 5000 | -3.72% |
3 segments, 10,000 spins
χ² = 6.335 (df = 2, critical 0.05 = 5.991), review needed · max deviation 3.55%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 3215 | 3333.33 | -3.55% |
| 1 | 3385 | 3333.33 | 1.55% |
| 2 | 3400 | 3333.33 | 2% |
4 segments, 10,000 spins
χ² = 2.3256 (df = 3, critical 0.05 = 7.815), uniform (pass) · max deviation 2%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 2550 | 2500 | 2% |
| 1 | 2463 | 2500 | -1.48% |
| 2 | 2463 | 2500 | -1.48% |
| 3 | 2524 | 2500 | 0.96% |
6 segments, 10,000 spins
χ² = 6.932 (df = 5, critical 0.05 = 11.07), uniform (pass) · max deviation 4.7%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 1659 | 1666.67 | -0.46% |
| 1 | 1683 | 1666.67 | 0.98% |
| 2 | 1632 | 1666.67 | -2.08% |
| 3 | 1676 | 1666.67 | 0.56% |
| 4 | 1605 | 1666.67 | -3.7% |
| 5 | 1745 | 1666.67 | 4.7% |
8 segments, 10,000 spins
χ² = 7.5632 (df = 7, critical 0.05 = 14.067), uniform (pass) · max deviation 4.88%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 1253 | 1250 | 0.24% |
| 1 | 1311 | 1250 | 4.88% |
| 2 | 1230 | 1250 | -1.6% |
| 3 | 1231 | 1250 | -1.52% |
| 4 | 1258 | 1250 | 0.64% |
| 5 | 1293 | 1250 | 3.44% |
| 6 | 1221 | 1250 | -2.32% |
| 7 | 1203 | 1250 | -3.76% |
10 segments, 10,000 spins
χ² = 7.782 (df = 9, critical 0.05 = 16.919), uniform (pass) · max deviation 5.4%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 954 | 1000 | -4.6% |
| 1 | 1007 | 1000 | 0.7% |
| 2 | 1004 | 1000 | 0.4% |
| 3 | 999 | 1000 | -0.1% |
| 4 | 1054 | 1000 | 5.4% |
| 5 | 997 | 1000 | -0.3% |
| 6 | 976 | 1000 | -2.4% |
| 7 | 977 | 1000 | -2.3% |
| 8 | 993 | 1000 | -0.7% |
| 9 | 1039 | 1000 | 3.9% |
12 segments, 10,000 spins
χ² = 13.0904 (df = 11, critical 0.05 = 19.675), uniform (pass) · max deviation 6.28%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 872 | 833.33 | 4.64% |
| 1 | 883 | 833.33 | 5.96% |
| 2 | 839 | 833.33 | 0.68% |
| 3 | 827 | 833.33 | -0.76% |
| 4 | 833 | 833.33 | -0.04% |
| 5 | 807 | 833.33 | -3.16% |
| 6 | 781 | 833.33 | -6.28% |
| 7 | 820 | 833.33 | -1.6% |
| 8 | 853 | 833.33 | 2.36% |
| 9 | 801 | 833.33 | -3.88% |
| 10 | 871 | 833.33 | 4.52% |
| 11 | 813 | 833.33 | -2.44% |
16 segments, 10,000 spins
χ² = 10.112 (df = 15, critical 0.05 = 25), uniform (pass) · max deviation 7.68%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 605 | 625 | -3.2% |
| 1 | 632 | 625 | 1.12% |
| 2 | 673 | 625 | 7.68% |
| 3 | 630 | 625 | 0.8% |
| 4 | 617 | 625 | -1.28% |
| 5 | 632 | 625 | 1.12% |
| 6 | 610 | 625 | -2.4% |
| 7 | 611 | 625 | -2.24% |
| 8 | 632 | 625 | 1.12% |
| 9 | 631 | 625 | 0.96% |
| 10 | 611 | 625 | -2.24% |
| 11 | 597 | 625 | -4.48% |
| 12 | 664 | 625 | 6.24% |
| 13 | 630 | 625 | 0.8% |
| 14 | 619 | 625 | -0.96% |
| 15 | 606 | 625 | -3.04% |
20 segments, 10,000 spins
χ² = 15.892 (df = 19, critical 0.05 = 30.144), uniform (pass) · max deviation 7%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 522 | 500 | 4.4% |
| 1 | 524 | 500 | 4.8% |
| 2 | 520 | 500 | 4% |
| 3 | 474 | 500 | -5.2% |
| 4 | 528 | 500 | 5.6% |
| 5 | 495 | 500 | -1% |
| 6 | 516 | 500 | 3.2% |
| 7 | 517 | 500 | 3.4% |
| 8 | 535 | 500 | 7% |
| 9 | 495 | 500 | -1% |
| 10 | 471 | 500 | -5.8% |
| 11 | 474 | 500 | -5.2% |
| 12 | 496 | 500 | -0.8% |
| 13 | 489 | 500 | -2.2% |
| 14 | 482 | 500 | -3.6% |
| 15 | 480 | 500 | -4% |
| 16 | 482 | 500 | -3.6% |
| 17 | 488 | 500 | -2.4% |
| 18 | 518 | 500 | 3.6% |
| 19 | 494 | 500 | -1.2% |
36 segments, 10,000 spins
χ² = 38.3984 (df = 35, critical 0.05 = 49.998), uniform (pass) · max deviation 15.04%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 236 | 277.78 | -15.04% |
| 1 | 287 | 277.78 | 3.32% |
| 2 | 293 | 277.78 | 5.48% |
| 3 | 252 | 277.78 | -9.28% |
| 4 | 264 | 277.78 | -4.96% |
| 5 | 279 | 277.78 | 0.44% |
| 6 | 314 | 277.78 | 13.04% |
| 7 | 277 | 277.78 | -0.28% |
| 8 | 261 | 277.78 | -6.04% |
| 9 | 279 | 277.78 | 0.44% |
| 10 | 307 | 277.78 | 10.52% |
| 11 | 266 | 277.78 | -4.24% |
| 12 | 299 | 277.78 | 7.64% |
| 13 | 269 | 277.78 | -3.16% |
| 14 | 299 | 277.78 | 7.64% |
| 15 | 258 | 277.78 | -7.12% |
| 16 | 295 | 277.78 | 6.2% |
| 17 | 261 | 277.78 | -6.04% |
| 18 | 274 | 277.78 | -1.36% |
| 19 | 263 | 277.78 | -5.32% |
| 20 | 278 | 277.78 | 0.08% |
| 21 | 260 | 277.78 | -6.4% |
| 22 | 269 | 277.78 | -3.16% |
| 23 | 281 | 277.78 | 1.16% |
| 24 | 299 | 277.78 | 7.64% |
| 25 | 271 | 277.78 | -2.44% |
| 26 | 299 | 277.78 | 7.64% |
| 27 | 277 | 277.78 | -0.28% |
| 28 | 259 | 277.78 | -6.76% |
| 29 | 293 | 277.78 | 5.48% |
| 30 | 268 | 277.78 | -3.52% |
| 31 | 307 | 277.78 | 10.52% |
| 32 | 283 | 277.78 | 1.88% |
| 33 | 275 | 277.78 | -1% |
| 34 | 278 | 277.78 | 0.08% |
| 35 | 270 | 277.78 | -2.8% |
How to cite
Raja Jahangir, Online Spin Wheel Fairness Study (2026-10-17), 100,000 simulated spins, https://onlinespinwheel.fun/spin-wheel-fairness-study, CSV: https://onlinespinwheel.fun/downloads/spin-wheel-fairness-study-100k.csv