Before each hand the server draws a 128-bit secret seed with crypto.randomBytes and shows every player its SHA-256 fingerprint. The deck is then shuffled by Fisher–Yates, taking its random numbers from SHA-256 of seed:0, seed:1, … with no modulo bias, and dealt one card at a time starting left of the dealer.
When the hand ends the seed is revealed. The app checks it against the fingerprint and reshuffles to confirm it produces exactly the hands that were dealt. Because the fingerprint was fixed first, nobody, the server included, can change the cards to favour anyone. There is nothing to buy, so there is nothing to favour.
Below: every online deal so far, 45 hands (180 hands of 13 cards), against what a fair deck produces. dealt expected
p = 0.35 (anything above 0.001 is what a fair shuffle produces; a small p now and then is expected)
p = 0.80 (anything above 0.001 is what a fair shuffle produces; a small p now and then is expected)
Average spades by seat (a fair deal gives 3.25 everywhere), and who gets the ace of spades.
| Seat | Spades per hand |
|---|---|
| Left of dealer | 3.20 |
| Across from dealer | 3.56 |
| Right of dealer | 2.80 |
| Dealer | 3.44 |
p = 0.20 (anything above 0.001 is what a fair shuffle produces; a small p now and then is expected)
| Seat | Ace of spades |
|---|---|
| Left of dealer | 33.3% |
| Across from dealer | 15.6% |
| Right of dealer | 24.4% |
| Dealer | 26.7% |
p = 0.41 (anything above 0.001 is what a fair shuffle produces; a small p now and then is expected)
Raw numbers and tests: /api/fairness. In the app, Stats → Your luck compares the cards you personally were dealt with a fair deck.