Spin Wheel Fairness Study, 100,000 Spins
We ran 100,000 automated spins on equal-size wheel slices using the same landing-angle geometry as our live spin wheel. Each configuration was tested for uniform distribution with Pearson's chi-square at α = 0.05. 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: crypto.getRandomValues (Node crypto.randomInt) landing angle → getCurrentSegment geometry
- Uniformity result: All configurations passed χ² at α = 0.05
- Data as of: 2026-07-14
- Download CSV (100,000 spin rows)
| Segments | Spins | χ² | df | Critical 0.05 | Result | Max deviation |
|---|---|---|---|---|---|---|
| 2 | 10,000 | 1.1664 | 1 | 3.841 | pass | 1.08% |
| 3 | 10,000 | 1.6274 | 2 | 5.991 | pass | 1.61% |
| 4 | 10,000 | 4.5784 | 3 | 7.815 | pass | 3.28% |
| 6 | 10,000 | 3.9584 | 5 | 11.07 | pass | 2.74% |
| 8 | 10,000 | 4.1376 | 7 | 14.067 | pass | 3.68% |
| 10 | 10,000 | 8.004 | 9 | 16.919 | pass | 5.1% |
| 12 | 10,000 | 19.3616 | 11 | 19.675 | pass | 9.68% |
| 16 | 10,000 | 19.5296 | 15 | 25 | pass | 8.64% |
| 20 | 10,000 | 18.5 | 19 | 30.144 | pass | 8% |
| 36 | 10,000 | 34.6832 | 35 | 49.998 | pass | 12.52% |
Methodology
For each segment count k, we simulated 10,000 independent spins. Each spin drew a landing angle with the same secure browser randomness 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.
2 segments, 10,000 spins
χ² = 1.1664 (df = 1, critical 0.05 = 3.841), uniform (pass) · max deviation 1.08%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 4946 | 5000 | -1.08% |
| 1 | 5054 | 5000 | 1.08% |
3 segments, 10,000 spins
χ² = 1.6274 (df = 2, critical 0.05 = 5.991), uniform (pass) · max deviation 1.61%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 3330 | 3333.33 | -0.1% |
| 1 | 3283 | 3333.33 | -1.51% |
| 2 | 3387 | 3333.33 | 1.61% |
4 segments, 10,000 spins
χ² = 4.5784 (df = 3, critical 0.05 = 7.815), uniform (pass) · max deviation 3.28%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 2457 | 2500 | -1.72% |
| 1 | 2448 | 2500 | -2.08% |
| 2 | 2582 | 2500 | 3.28% |
| 3 | 2513 | 2500 | 0.52% |
6 segments, 10,000 spins
χ² = 3.9584 (df = 5, critical 0.05 = 11.07), uniform (pass) · max deviation 2.74%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 1697 | 1666.67 | 1.82% |
| 1 | 1636 | 1666.67 | -1.84% |
| 2 | 1621 | 1666.67 | -2.74% |
| 3 | 1701 | 1666.67 | 2.06% |
| 4 | 1646 | 1666.67 | -1.24% |
| 5 | 1699 | 1666.67 | 1.94% |
8 segments, 10,000 spins
χ² = 4.1376 (df = 7, critical 0.05 = 14.067), uniform (pass) · max deviation 3.68%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 1251 | 1250 | 0.08% |
| 1 | 1204 | 1250 | -3.68% |
| 2 | 1243 | 1250 | -0.56% |
| 3 | 1269 | 1250 | 1.52% |
| 4 | 1278 | 1250 | 2.24% |
| 5 | 1274 | 1250 | 1.92% |
| 6 | 1217 | 1250 | -2.64% |
| 7 | 1264 | 1250 | 1.12% |
10 segments, 10,000 spins
χ² = 8.004 (df = 9, critical 0.05 = 16.919), uniform (pass) · max deviation 5.1%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 966 | 1000 | -3.4% |
| 1 | 1025 | 1000 | 2.5% |
| 2 | 1014 | 1000 | 1.4% |
| 3 | 954 | 1000 | -4.6% |
| 4 | 995 | 1000 | -0.5% |
| 5 | 968 | 1000 | -3.2% |
| 6 | 1051 | 1000 | 5.1% |
| 7 | 1012 | 1000 | 1.2% |
| 8 | 1006 | 1000 | 0.6% |
| 9 | 1009 | 1000 | 0.9% |
12 segments, 10,000 spins
χ² = 19.3616 (df = 11, critical 0.05 = 19.675), uniform (pass) · max deviation 9.68%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 802 | 833.33 | -3.76% |
| 1 | 889 | 833.33 | 6.68% |
| 2 | 786 | 833.33 | -5.68% |
| 3 | 801 | 833.33 | -3.88% |
| 4 | 800 | 833.33 | -4% |
| 5 | 822 | 833.33 | -1.36% |
| 6 | 850 | 833.33 | 2% |
| 7 | 854 | 833.33 | 2.48% |
| 8 | 839 | 833.33 | 0.68% |
| 9 | 823 | 833.33 | -1.24% |
| 10 | 820 | 833.33 | -1.6% |
| 11 | 914 | 833.33 | 9.68% |
16 segments, 10,000 spins
χ² = 19.5296 (df = 15, critical 0.05 = 25), uniform (pass) · max deviation 8.64%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 665 | 625 | 6.4% |
| 1 | 612 | 625 | -2.08% |
| 2 | 640 | 625 | 2.4% |
| 3 | 648 | 625 | 3.68% |
| 4 | 654 | 625 | 4.64% |
| 5 | 590 | 625 | -5.6% |
| 6 | 610 | 625 | -2.4% |
| 7 | 608 | 625 | -2.72% |
| 8 | 571 | 625 | -8.64% |
| 9 | 619 | 625 | -0.96% |
| 10 | 648 | 625 | 3.68% |
| 11 | 626 | 625 | 0.16% |
| 12 | 576 | 625 | -7.84% |
| 13 | 651 | 625 | 4.16% |
| 14 | 645 | 625 | 3.2% |
| 15 | 637 | 625 | 1.92% |
20 segments, 10,000 spins
χ² = 18.5 (df = 19, critical 0.05 = 30.144), uniform (pass) · max deviation 8%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 494 | 500 | -1.2% |
| 1 | 494 | 500 | -1.2% |
| 2 | 468 | 500 | -6.4% |
| 3 | 481 | 500 | -3.8% |
| 4 | 509 | 500 | 1.8% |
| 5 | 538 | 500 | 7.6% |
| 6 | 493 | 500 | -1.4% |
| 7 | 472 | 500 | -5.6% |
| 8 | 509 | 500 | 1.8% |
| 9 | 495 | 500 | -1% |
| 10 | 495 | 500 | -1% |
| 11 | 462 | 500 | -7.6% |
| 12 | 540 | 500 | 8% |
| 13 | 540 | 500 | 8% |
| 14 | 488 | 500 | -2.4% |
| 15 | 493 | 500 | -1.4% |
| 16 | 503 | 500 | 0.6% |
| 17 | 501 | 500 | 0.2% |
| 18 | 504 | 500 | 0.8% |
| 19 | 521 | 500 | 4.2% |
36 segments, 10,000 spins
χ² = 34.6832 (df = 35, critical 0.05 = 49.998), uniform (pass) · max deviation 12.52%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 248 | 277.78 | -10.72% |
| 1 | 295 | 277.78 | 6.2% |
| 2 | 268 | 277.78 | -3.52% |
| 3 | 270 | 277.78 | -2.8% |
| 4 | 290 | 277.78 | 4.4% |
| 5 | 271 | 277.78 | -2.44% |
| 6 | 280 | 277.78 | 0.8% |
| 7 | 295 | 277.78 | 6.2% |
| 8 | 283 | 277.78 | 1.88% |
| 9 | 312 | 277.78 | 12.32% |
| 10 | 275 | 277.78 | -1% |
| 11 | 270 | 277.78 | -2.8% |
| 12 | 252 | 277.78 | -9.28% |
| 13 | 298 | 277.78 | 7.28% |
| 14 | 274 | 277.78 | -1.36% |
| 15 | 288 | 277.78 | 3.68% |
| 16 | 310 | 277.78 | 11.6% |
| 17 | 280 | 277.78 | 0.8% |
| 18 | 256 | 277.78 | -7.84% |
| 19 | 269 | 277.78 | -3.16% |
| 20 | 289 | 277.78 | 4.04% |
| 21 | 301 | 277.78 | 8.36% |
| 22 | 280 | 277.78 | 0.8% |
| 23 | 279 | 277.78 | 0.44% |
| 24 | 243 | 277.78 | -12.52% |
| 25 | 288 | 277.78 | 3.68% |
| 26 | 253 | 277.78 | -8.92% |
| 27 | 262 | 277.78 | -5.68% |
| 28 | 267 | 277.78 | -3.88% |
| 29 | 272 | 277.78 | -2.08% |
| 30 | 292 | 277.78 | 5.12% |
| 31 | 296 | 277.78 | 6.56% |
| 32 | 264 | 277.78 | -4.96% |
| 33 | 274 | 277.78 | -1.36% |
| 34 | 276 | 277.78 | -0.64% |
| 35 | 280 | 277.78 | 0.8% |