RNG Tournament
Eleven random number generators walk into a lottery. Eight classical, two cryptographic, one seeded by the current Bitcoin block hash. Each generates 50 picks per draw against every real Powerball result on record. The best match counts as their score. Who wins?
Standings · 1,951 draws · 50 picks each
● variance detected| Rank | RNG | Matches | Share | Avg | Wins | Best | 3+ hits | Streak |
|---|---|---|---|---|---|---|---|---|
| 1 | Mulberry32 | 3,852 | 1.974 | 784 | 4 | 189 | 8 | |
| 2 | Math.random | 3,845 | 1.971 | 783 | 4 | 185 | 8 | |
| 3 | ChaCha20 | 3,835 | 1.966 | 777 | 4 | 190 | 12 | |
| 4 | LCG | 3,832 | 1.964 | 774 | 4 | 200 | 9 | |
| 5 | MSWS | 3,823 | 1.960 | 756 | 4 | 164 | 8 | |
| 6 | PCG | 3,821 | 1.958 | 763 | 4 | 172 | 10 | |
| 7 | Bitcoin Block | 3,816 | 1.956 | 768 | 4 | 169 | 7 | |
| 8 | Xorshift128 | 3,811 | 1.953 | 763 | 4 | 184 | 11 | |
| 9 | SplitMix | 3,809 | 1.952 | 748 | 4 | 153 | 7 | |
| 10 | Fibonacci | 3,803 | 1.949 | 763 | 4 | 175 | 8 | |
| 11 | Web Crypto | 3,759 | 1.927 | 725 | 3 | 160 | 7 |
Match distribution · best of 50 per draw
| RNG | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| Mulberry32 | 0.0% | 12.5% | 77.9% | 9.5% | 0.2% | 0.0% |
| Math.random | 0.0% | 12.6% | 78.0% | 9.3% | 0.2% | 0.0% |
| ChaCha20 | 0.0% | 13.3% | 77.0% | 9.6% | 0.1% | 0.0% |
| LCG | 0.0% | 14.1% | 75.6% | 9.9% | 0.3% | 0.0% |
| MSWS | 0.0% | 12.7% | 78.9% | 8.1% | 0.3% | 0.0% |
| PCG | 0.0% | 13.0% | 78.2% | 8.8% | 0.1% | 0.0% |
| Bitcoin Block | 0.0% | 13.3% | 78.1% | 8.5% | 0.2% | 0.0% |
| Xorshift128 | 0.0% | 14.2% | 76.4% | 9.3% | 0.1% | 0.0% |
| SplitMix | 0.0% | 12.8% | 79.3% | 7.6% | 0.2% | 0.0% |
| Fibonacci | 0.0% | 14.4% | 76.7% | 8.7% | 0.3% | 0.0% |
| Web Crypto | 0.0% | 15.5% | 76.3% | 8.2% | 0.0% | 0.0% |
Theory vs reality
| k | P(single pick) | P(best = k) | Expected draws | Avg actual |
|---|---|---|---|---|
| 0 | 67.8427% | 0.0000% | 0.0 | 0.0 |
| 1 | 28.2678% | 13.7576% | 268.4 | 263.1 |
| 2 | 3.7073% | 77.5256% | 1512.5 | 1511.5 |
| 3 | 0.1794% | 8.5740% | 167.3 | 173.1 |
| 4 | 0.0028% | 0.1423% | 2.8 | 3.4 |
| 5 | 0.0000% | 0.0004% | 0.0 | 0.0 |
How it works
Eight classical RNGs — Math.random (whatever V8 uses), Mulberry32, Xorshift128, a Linear Congruential Generator, SplitMix, Middle Square Weyl Sequence, PCG, and a Fibonacci generator. Two cryptographic-grade: pure-JS ChaCha20 (the stream cipher used in modern TLS) and the Web Crypto API (OS-sourced entropy). And one Bitcoin-seeded: a ChaCha20 stream keyed by the current Bitcoin block tip hash — a 256-bit value nobody could predict before the block was mined, verifiable by anyone on any block explorer. Classical RNGs are reseeded per draw for reproducibility; Web Crypto pulls fresh randomness every invocation.
For every historical draw, each RNG generates 50random 5-number picks. The best pick (most white balls matched) scores. We total matches across all draws and rank by total — and by how many times each RNG produced the tournament-high match for that specific draw (the “wins” column).
The theoretical expected value sits in the last table: the chance of any 50-pick batch hitting 3+ matches on a fair draw is about 0.2%. With 1,951 draws that's a handful per RNG — well within noise. If any RNG consistently outperformed by more than 2%, that'd be news. None do — including Bitcoin.