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-08-31
- Download CSV (100,000 spin rows)
| Segments | Spins | χ² | df | Critical 0.05 | Result | Max deviation |
|---|---|---|---|---|---|---|
| 2 | 10,000 | 0.7056 | 1 | 3.841 | pass | 0.84% |
| 3 | 10,000 | 3.4586 | 2 | 5.991 | pass | 2.63% |
| 4 | 10,000 | 2.5152 | 3 | 7.815 | pass | 2.32% |
| 6 | 10,000 | 10.8068 | 5 | 11.07 | pass | 6.7% |
| 8 | 10,000 | 10.3584 | 7 | 14.067 | pass | 6.08% |
| 10 | 10,000 | 14.476 | 9 | 16.919 | pass | 7.5% |
| 12 | 10,000 | 11.1872 | 11 | 19.675 | pass | 6.08% |
| 16 | 10,000 | 19.1584 | 15 | 25 | pass | 11.2% |
| 20 | 10,000 | 9.656 | 19 | 30.144 | pass | 7.2% |
| 36 | 10,000 | 41.5232 | 35 | 49.998 | pass | 11.8% |
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
χ² = 0.7056 (df = 1, critical 0.05 = 3.841), uniform (pass) · max deviation 0.84%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 4958 | 5000 | -0.84% |
| 1 | 5042 | 5000 | 0.84% |
3 segments, 10,000 spins
χ² = 3.4586 (df = 2, critical 0.05 = 5.991), uniform (pass) · max deviation 2.63%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 3289 | 3333.33 | -1.33% |
| 1 | 3421 | 3333.33 | 2.63% |
| 2 | 3290 | 3333.33 | -1.3% |
4 segments, 10,000 spins
χ² = 2.5152 (df = 3, critical 0.05 = 7.815), uniform (pass) · max deviation 2.32%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 2554 | 2500 | 2.16% |
| 1 | 2442 | 2500 | -2.32% |
| 2 | 2502 | 2500 | 0.08% |
| 3 | 2502 | 2500 | 0.08% |
6 segments, 10,000 spins
χ² = 10.8068 (df = 5, critical 0.05 = 11.07), uniform (pass) · max deviation 6.7%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 1699 | 1666.67 | 1.94% |
| 1 | 1671 | 1666.67 | 0.26% |
| 2 | 1657 | 1666.67 | -0.58% |
| 3 | 1689 | 1666.67 | 1.34% |
| 4 | 1729 | 1666.67 | 3.74% |
| 5 | 1555 | 1666.67 | -6.7% |
8 segments, 10,000 spins
χ² = 10.3584 (df = 7, critical 0.05 = 14.067), uniform (pass) · max deviation 6.08%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 1326 | 1250 | 6.08% |
| 1 | 1286 | 1250 | 2.88% |
| 2 | 1252 | 1250 | 0.16% |
| 3 | 1185 | 1250 | -5.2% |
| 4 | 1252 | 1250 | 0.16% |
| 5 | 1255 | 1250 | 0.4% |
| 6 | 1217 | 1250 | -2.64% |
| 7 | 1227 | 1250 | -1.84% |
10 segments, 10,000 spins
χ² = 14.476 (df = 9, critical 0.05 = 16.919), uniform (pass) · max deviation 7.5%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 997 | 1000 | -0.3% |
| 1 | 964 | 1000 | -3.6% |
| 2 | 925 | 1000 | -7.5% |
| 3 | 1002 | 1000 | 0.2% |
| 4 | 1054 | 1000 | 5.4% |
| 5 | 1044 | 1000 | 4.4% |
| 6 | 980 | 1000 | -2% |
| 7 | 976 | 1000 | -2.4% |
| 8 | 1033 | 1000 | 3.3% |
| 9 | 1025 | 1000 | 2.5% |
12 segments, 10,000 spins
χ² = 11.1872 (df = 11, critical 0.05 = 19.675), uniform (pass) · max deviation 6.08%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 872 | 833.33 | 4.64% |
| 1 | 806 | 833.33 | -3.28% |
| 2 | 805 | 833.33 | -3.4% |
| 3 | 850 | 833.33 | 2% |
| 4 | 826 | 833.33 | -0.88% |
| 5 | 804 | 833.33 | -3.52% |
| 6 | 884 | 833.33 | 6.08% |
| 7 | 845 | 833.33 | 1.4% |
| 8 | 791 | 833.33 | -5.08% |
| 9 | 850 | 833.33 | 2% |
| 10 | 821 | 833.33 | -1.48% |
| 11 | 846 | 833.33 | 1.52% |
16 segments, 10,000 spins
χ² = 19.1584 (df = 15, critical 0.05 = 25), uniform (pass) · max deviation 11.2%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 602 | 625 | -3.68% |
| 1 | 624 | 625 | -0.16% |
| 2 | 636 | 625 | 1.76% |
| 3 | 627 | 625 | 0.32% |
| 4 | 633 | 625 | 1.28% |
| 5 | 626 | 625 | 0.16% |
| 6 | 630 | 625 | 0.8% |
| 7 | 668 | 625 | 6.88% |
| 8 | 623 | 625 | -0.32% |
| 9 | 666 | 625 | 6.56% |
| 10 | 629 | 625 | 0.64% |
| 11 | 592 | 625 | -5.28% |
| 12 | 555 | 625 | -11.2% |
| 13 | 658 | 625 | 5.28% |
| 14 | 630 | 625 | 0.8% |
| 15 | 601 | 625 | -3.84% |
20 segments, 10,000 spins
χ² = 9.656 (df = 19, critical 0.05 = 30.144), uniform (pass) · max deviation 7.2%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 494 | 500 | -1.2% |
| 1 | 507 | 500 | 1.4% |
| 2 | 476 | 500 | -4.8% |
| 3 | 517 | 500 | 3.4% |
| 4 | 479 | 500 | -4.2% |
| 5 | 495 | 500 | -1% |
| 6 | 512 | 500 | 2.4% |
| 7 | 536 | 500 | 7.2% |
| 8 | 511 | 500 | 2.2% |
| 9 | 498 | 500 | -0.4% |
| 10 | 502 | 500 | 0.4% |
| 11 | 491 | 500 | -1.8% |
| 12 | 519 | 500 | 3.8% |
| 13 | 503 | 500 | 0.6% |
| 14 | 501 | 500 | 0.2% |
| 15 | 469 | 500 | -6.2% |
| 16 | 506 | 500 | 1.2% |
| 17 | 487 | 500 | -2.6% |
| 18 | 488 | 500 | -2.4% |
| 19 | 509 | 500 | 1.8% |
36 segments, 10,000 spins
χ² = 41.5232 (df = 35, critical 0.05 = 49.998), uniform (pass) · max deviation 11.8%
| Slice index | Observed | Expected | Deviation % |
|---|---|---|---|
| 0 | 252 | 277.78 | -9.28% |
| 1 | 282 | 277.78 | 1.52% |
| 2 | 284 | 277.78 | 2.24% |
| 3 | 290 | 277.78 | 4.4% |
| 4 | 267 | 277.78 | -3.88% |
| 5 | 280 | 277.78 | 0.8% |
| 6 | 252 | 277.78 | -9.28% |
| 7 | 298 | 277.78 | 7.28% |
| 8 | 260 | 277.78 | -6.4% |
| 9 | 245 | 277.78 | -11.8% |
| 10 | 245 | 277.78 | -11.8% |
| 11 | 278 | 277.78 | 0.08% |
| 12 | 300 | 277.78 | 8% |
| 13 | 289 | 277.78 | 4.04% |
| 14 | 293 | 277.78 | 5.48% |
| 15 | 286 | 277.78 | 2.96% |
| 16 | 281 | 277.78 | 1.16% |
| 17 | 293 | 277.78 | 5.48% |
| 18 | 275 | 277.78 | -1% |
| 19 | 258 | 277.78 | -7.12% |
| 20 | 295 | 277.78 | 6.2% |
| 21 | 261 | 277.78 | -6.04% |
| 22 | 286 | 277.78 | 2.96% |
| 23 | 299 | 277.78 | 7.64% |
| 24 | 274 | 277.78 | -1.36% |
| 25 | 298 | 277.78 | 7.28% |
| 26 | 305 | 277.78 | 9.8% |
| 27 | 300 | 277.78 | 8% |
| 28 | 264 | 277.78 | -4.96% |
| 29 | 282 | 277.78 | 1.52% |
| 30 | 306 | 277.78 | 10.16% |
| 31 | 249 | 277.78 | -10.36% |
| 32 | 267 | 277.78 | -3.88% |
| 33 | 251 | 277.78 | -9.64% |
| 34 | 274 | 277.78 | -1.36% |
| 35 | 281 | 277.78 | 1.16% |