[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-article-provably-fair-rng-explained-en":3,"mdc-6d9ml3-key":78},{"id":4,"slug":5,"status":6,"section":7,"category":8,"author":9,"publish_date":10,"read_time":11,"image":12,"embedded_components":13,"related_calculators":13,"related_articles":14,"title":15,"description":16,"keywords":17,"content":26,"faq":27,"availableLocales":73},"e9e77cbe-752e-46fa-880b-37532301b050","provably-fair-rng-explained","published","casino","guides","Evgeniy Volkov","2026-04-22",14,"\u002Fimages\u002Fblog\u002Fprovably-fair-rng-explained.webp","[]",[],"Provably Fair RNG Explained: Full Technical Guide (2026)","Provably fair random number generation — how HMAC-SHA256 turns seeds into dice rolls, crash multipliers, cards. Full math + live verifier (2026).",[18,19,20,21,22,23,24,25],"provably fair random number generation","provably fair rng","hmac-sha256 rng","csprng provably fair","chainlink vrf casino","provably fair dice formula","provably fair crash formula","pf rng attack surface","# Provably Fair Random Number Generation Explained (2026)\n\nYou just placed a 0.5 BTC bet on a crypto dice game. The screen rolls `37.42` and you lose. You open the fairness panel and it shows a server seed hash, your client seed, and a nonce — four values that supposedly prove nothing was rigged. But how did those four values *become* 37.42? What actually turned random hex characters into a specific dice roll?\n\nHere's the thing: the entire \"provably fair\" promise hinges on one specific act — converting cryptographic hash output into game outcomes. Miss how that conversion works and provably fair feels like magic marketing. Understand it and you can audit any PF casino in about 60 seconds, spot fake implementations on sight, and know exactly which attacks the protocol does and doesn't defeat.\n\nThis guide walks you through **provably fair random number generation** the way a developer would build one in 2026 — the CSPRNG primitives under the hood, the HMAC-SHA256 formula that turns seeds into numbers, the different mapping schemes for dice, crash, and cards, and the attack surface that survives even when the math is perfect. By the end you'll know why PF RNGs are cryptographically unbreakable, which implementation bugs still ruin them, and when blockchain randomness (Chainlink VRF) kicks in instead.\n\n## TL;DR — How PF RNGs Actually Generate Numbers\n\nEvery provably fair game uses the same core RNG primitive, only the output mapping changes. Here's the 60-second version.\n\n| Step | What happens | Who controls it |\n|---|---|---|\n| 1. Generate server seed | Casino's CSPRNG outputs a 32-64 byte random string | Casino |\n| 2. Hash and publish | SHA-256(server_seed) is shown to you before the round | Casino |\n| 3. Collect client seed + nonce | Your browser adds a client seed; nonce is the round counter | You + protocol |\n| 4. Compute HMAC | `hex = HMAC-SHA256(server_seed, client_seed : nonce)` | Deterministic |\n| 5. Map hex to outcome | Slice + modulo + divide = dice roll, crash multiplier, or card | Deterministic |\n| 6. Reveal and verify | After rotation the raw seed is revealed; anyone can re-run step 4 | You |\n\nThe math is:\n\n$$\\text{outcome} = f\\big(\\text{HMAC-SHA256}(\\text{server\\_seed},\\; \\text{client\\_seed} : \\text{nonce})\\big)$$\n\nWhere `f` is a game-specific mapping function — `f_dice` returns 0-99.99, `f_crash` returns a multiplier, `f_cards` returns shuffled deck positions. The HMAC part is identical across every PF casino in the world.\n\n### Key Numbers You Need to Know\n\n- **3 inputs**: server seed + client seed + nonce produce every outcome\n- **64 hex chars**: length of a SHA-256 \u002F HMAC-SHA256 output\n- **128 hex chars**: length of HMAC-SHA512 (used by BC.Game and PF blackjack)\n- **~2^256 operations**: what it would take to break HMAC-SHA256 — astronomically out of reach\n- **0.00-99.99**: standard dice range after mapping\n- **1.00x to ∞**: standard crash multiplier range (bounded in practice by float precision)\n\n### Fair ≠ Profitable\n\nThe RNG being provably fair tells you the casino couldn't manipulate the outcome *after* you bet. It does **not** tell you:\n\n- Whether the house edge is reasonable (check RTP separately)\n- Whether the casino will honor withdrawals\n- Whether bonuses and wagering terms are honest\n- Whether the server seed pool was unbiased before it was committed\n\nWe'll cover the full attack surface below. For a broader comparison with traditional certification, see our [provably fair vs RNG certified](\u002Fblog\u002Fprovably-fair-vs-rng-certified) guide.\n\n## What Makes an RNG \"Provably Fair\"\n\nBefore we get to the formula, it helps to separate *provably fair* from the broader RNG world. PF is a specific upgrade to CSPRNGs, not a replacement.\n\n### The Commit-Reveal Primitive\n\nThe whole trick behind provably fair is a cryptographic pattern called **commit-reveal**.\n\nBefore the round starts, the casino commits to a specific server seed by publishing its SHA-256 hash. The hash is a 64-character fingerprint that uniquely identifies the seed without revealing it. Because SHA-256 has no practical collision attacks, the casino can't later find a *different* seed that produces the same hash — they're locked in.\n\nAfter the round (or after you rotate seeds), the raw server seed is revealed. You hash it yourself. If your computed hash matches what was published before the round, the casino proved they didn't swap seeds mid-round. Combined with your client seed (which they didn't know in advance), this makes per-round outcome manipulation cryptographically impossible.\n\nThe commit-reveal layer is what separates PF from any other CSPRNG. A traditional RNG-certified casino also uses a CSPRNG — but nothing stops them from swapping it out in production, as [iTech Labs audits only prove statistical properties](https:\u002F\u002Fwww.itechlabs.com), not runtime identity.\n\n### HMAC as the RNG Primitive\n\nHMAC-SHA256 is the actual random number generator inside every PF round. Here's why it works:\n\n- **Deterministic**: Given the same inputs, HMAC always produces the same output. This is what lets you verify.\n- **One-way**: Given the output, you can't recover the server seed (the key). This is what keeps the outcome unpredictable.\n- **Uniform**: HMAC outputs are indistinguishable from random 256-bit strings. This is what keeps the game unbiased.\n- **Keyed**: The server seed acts as a secret that must be known to reproduce the output. This is what prevents tampering.\n\nTechnically, HMAC-SHA256 isn't a CSPRNG by itself — it's a message authentication code. But when the key (server seed) is generated from a real entropy source, the construction is equivalent to a CSPRNG for all practical purposes. NIST formalized this as **HMAC_DRBG** in [SP 800-90A Rev 1](https:\u002F\u002Fcsrc.nist.gov\u002Fpublications\u002Fdetail\u002Fsp\u002F800-90a\u002Frev-1\u002Ffinal), and PF casinos essentially reimplement that standard with the addition of public seed commitment.\n\n### Why CSPRNGs Matter (Not Math.random)\n\nEvery legitimate PF casino generates its server seed with a cryptographically secure RNG — **not** JavaScript's `Math.random()`. The difference matters more than most players realize:\n\n| Generator | Predictable after seeing output? | Acceptable for PF? |\n|---|---|---|\n| `Math.random()` (V8 in Chrome) | Yes, after ~700 outputs | Never |\n| Linux `\u002Fdev\u002Furandom` | No | Yes |\n| `crypto.getRandomValues` (browser) | No | Yes |\n| Node.js `crypto.randomBytes` | No | Yes |\n| Hardware RNG (Intel RDRAND) | No | Yes |\n\nIf a casino secretly seeds its server with `Math.random()`, a sophisticated attacker could reconstruct the seed from enough public outputs and predict every future round — even if the HMAC math is flawless. This is why checking your casino actually uses `crypto.randomBytes` or equivalent matters; the [what is provably fair gambling](\u002Fblog\u002Fwhat-is-provably-fair-gambling) explainer covers the full chain of trust.\n\n## How the Number Is Actually Generated\n\nNow the actual formula. This is the section to bookmark — everything above was context.\n\n### Three Inputs, One Formula\n\nEvery provably fair round computes:\n\n$$\\text{hex\\_output} = \\text{HMAC-SHA256}(\\text{server\\_seed},\\; \\text{client\\_seed} \\; : \\; \\text{nonce})$$\n\nIn pseudocode:\n\n```\nfunction pfHmac(serverSeed, clientSeed, nonce) {\n  const message = clientSeed + ':' + nonce\n  const hex = hmacSha256(serverSeed, message)  \u002F\u002F 64-char hex string\n  return hex\n}\n```\n\nThe `:` colon is the canonical separator on Stake, Primedice, Rainbet, and most PF casinos. A few (BC.Game, Roobet) use different delimiters — always check the casino's fairness docs for the exact format.\n\nThe output is a 64-character hexadecimal string like `8b2d4a1f9c6e7b3d5a8f2c9e4b1d7a6f3e8c5b2d9a4f7e1c8b3d6a2f9e5c4b7d`. That hex is the raw randomness — 256 bits of unpredictability, statistically indistinguishable from flipping 256 fair coins.\n\n::chart-provably-fair-process\n::\n\n### Step-by-Step: From HMAC Output to Dice Roll\n\nLet's do one round end-to-end.\n\n**Given values:**\n\n- `server_seed = f4a9c2e1b7d8e3c5a1b9f6d2e8c4a7b3e9d1c6a2b5f8e4c7a3b6e1d9c2a5b8f4`\n- `client_seed = player-xyz-42`\n- `nonce = 7`\n\n**Step 1 — Compute HMAC:**\n\n```\nHMAC-SHA256(server_seed, \"player-xyz-42:7\")\n= 8b2d4a1f9c6e7b3d5a8f2c9e4b1d7a6f3e8c5b2d9a4f7e1c8b3d6a2f9e5c4b7d\n```\n\n**Step 2 — Slice first 5 hex characters:**\n\n`8b2d4` → convert to decimal → `569,300`\n\n**Step 3 — Map to 0-99.9999:**\n\n```\ndice = (569_300 % 1_000_000) \u002F 10_000\n     = 569_300 \u002F 10_000\n     = 56.93\n```\n\n**Step 4 — Apply bet logic:**\n\nIf you bet \"roll under 50\" → you lose (56.93 > 50). If you bet \"roll under 60\" → you win. The exact roll was determined the instant those three inputs combined, before any UI animation ran.\n\n**Step 5 — Verify:**\n\nPost-round, you receive the revealed `server_seed`. You hash it — SHA-256 matches the pre-committed hash? Good. You re-run steps 1-3 — reproduced `56.93`? Good. The round is cryptographically proven fair.\n\nFor a full walkthrough with copy-paste values and screenshots, see [how to verify a provably fair round](\u002Fblog\u002Fhow-to-verify-provably-fair).\n\n### Different Games, Different Mappings\n\nThe HMAC call is always identical. What changes is step 3 — how the hex gets mapped to a specific game outcome.\n\n| Game | Hex slice | Formula | Output range |\n|---|---|---|---|\n| **Dice** | First 5 chars | `(int % 1e6) \u002F 1e4` | 0.0000-99.9999 |\n| **Crash** | First 8 chars | `floor((100 * 2^52 - h) \u002F (2^52 - h)) \u002F 100` | 1.00x to very high |\n| **Coinflip** | First 2 chars | `int % 2` (0 or 1) | Heads\u002FTails |\n| **Roulette** | First 2 chars | `int % 37` (Euro) or `% 38` (Am) | 0-36 or 0-37 |\n| **Plinko** | First 4 chars × n drops | `int % rows` per drop | Path through pegs |\n| **Blackjack (HMAC-SHA512)** | 4 chars per card | `int % 52` with replacement logic | Card deck position |\n\nEach mapping is designed to be uniform across its output range — modular arithmetic on a uniformly random hex value preserves uniformity. This is why PF games can claim honest RTP without the casino manipulating individual rounds. It's the *mapping formula* that gets tuned to hit the casino's target house edge, not the random number itself.\n\n## From Hex String to Game Outcome (With Math)\n\nThe dice mapping is worth dissecting because it's the clearest case — and because it shows why provably fair dice distributions are genuinely uniform when implemented correctly.\n\n### Dice Mapping (0-99.9999)\n\nStake's dice uses the first 5 hex characters, which gives 20 bits = 1,048,576 possible values. The mapping is:\n\n$$\\text{dice} = \\frac{(\\text{int}(\\text{hex}_{0:5}) \\; \\text{mod} \\; 10^6)}{10^4}$$\n\nWhy modulo 1,000,000 when the slice can reach 1,048,575? Because without the modulo, values 1,000,000-1,048,575 would map to 100.0000-104.8575, outside the dice range. Modulo folds those back — but introduces a tiny bias (values 0-48,575 are more likely than 48,576-99,999 by a factor of 2\u002F1). To eliminate the bias, real implementations *reject* slices above 1,000,000 and advance to the next hex chunk (chars 5-10, then 10-15, etc.).\n\nDone correctly, this produces a perfectly uniform distribution across 0.0000-99.9999. A 10,000-roll test shows essentially flat coverage — the histogram below reproduces what you'd see with any legitimate PF dice implementation.\n\n::chart-rng-distribution\n::\n\n### Crash Mapping (Multiplier)\n\nCrash is more interesting because the output isn't uniform — it's deliberately skewed to create dramatic gameplay while preserving a target house edge.\n\n$$\\text{crash} = \\frac{\\left\\lfloor \\dfrac{100 \\cdot 2^{52} - h}{2^{52} - h} \\right\\rfloor}{100}$$\n\nWhere `h = int(hex[0:8])` (a 32-bit integer from the first 8 hex chars). With one modification: if `h mod 33 == 0`, the multiplier is 1.00x (instant bust), which creates Stake's ~1% house edge. Other casinos use different divisors — 25 (Rainbet ~4% edge), 50 (low-edge variants), 100 (very low-edge).\n\nRun this formula a million times and you get a distribution where ~50% of rounds bust under 2x, ~10% pass 10x, and maybe 1% reach 100x. The expected value works out to 0.99 per 1 bet — the missing 1% is the house edge baked into the formula's constants, not into any per-round manipulation.\n\n### Card Mapping (Deck Shuffles)\n\nPF blackjack, poker, and baccarat shuffle virtual decks using HMAC-SHA512 (longer output = more cards per hash call). The Fisher-Yates shuffle is the standard:\n\n```\nfor i = 51 down to 1:\n  j = hmac_int(i) mod (i + 1)\n  swap(deck[i], deck[j])\n```\n\nEach `hmac_int(i)` call consumes 4 hex chars of the 128-char SHA-512 output. One round's cards are fully determined by one HMAC call, which is why you often see PF blackjack games show 13+ decimal-converted integers in the verification panel — one per card swap. For the specific implementation on Stake and BC.Game, see the [provably fair blackjack guide](\u002Fblog\u002Fprovably-fair-blackjack).\n\n## Traditional RNG vs Provably Fair RNG\n\nAt the RNG level specifically (not the broader fairness stack), PF is a strict superset of certified CSPRNG.\n\n### Where Traditional RNGs Fall Short\n\nCertified RNGs from eCOGRA, iTech Labs, and GLI are all cryptographically secure — the math is as strong as PF's. The problem isn't the primitive, it's the **runtime trust model**:\n\n- The certified RNG lives on the casino's server, audited once\n- You never see its output directly, only the game's end state\n- Nothing forces the casino to keep running the certified code in production\n- A per-round dispute can't be resolved in real time\n\nIf Pragmatic Play's certified slot engine quietly runs a different RNG in Roobet's production than the one eCOGRA tested, no amount of certificate checking catches it. The gap closes only with open verification per round.\n\n### What PF Adds to the Primitive\n\nProvably fair takes the same cryptographic foundation and exposes it. Specifically:\n\n- The server seed hash is published *before* your bet (commitment)\n- Your client seed contributes to the HMAC input (co-signing)\n- The raw server seed is revealed after the round (reveal)\n- The computation is deterministic and reproducible in any browser (verification)\n\nThat's the whole difference. Same HMAC, same CSPRNG math — with four extra steps of transparency layered on top. For a deeper walkthrough of how both models stack up, see [provably fair vs RNG certified](\u002Fblog\u002Fprovably-fair-vs-rng-certified).\n\n## Blockchain Randomness — Chainlink VRF and Onchain Games\n\nPF RNG covers centralized crypto casinos nicely. But what about fully decentralized applications — onchain lotteries, NFT trait assignment, onchain dice? That's where a different solution takes over.\n\n### Why Blockchains Can't Generate Secure Random Numbers\n\nEvery blockchain is deterministic by design — every validator must produce the same state from the same inputs, or consensus breaks. That makes randomness structurally hard:\n\n- `block.timestamp` is miner-controllable within a few seconds\n- `block.blockhash` can be manipulated by miners withholding blocks\n- `block.prevrandao` (post-Merge Ethereum) is better but still biasable by validators\n- Any onchain entropy source can be read by the contract *before* it's used, defeating the purpose\n\nNaive dApp lotteries that used blockhash have been drained in the past. The economic incentive to manipulate a $1M jackpot can make a miner rationally withhold a block.\n\n### How Chainlink VRF Solves It\n\n**Chainlink VRF** (Verifiable Random Function) generates randomness offchain and delivers it onchain with a cryptographic proof. The flow:\n\n1. Smart contract requests a random number\n2. Chainlink oracle generates the value offchain using its private key + request seed\n3. The proof is a [BLS signature](https:\u002F\u002Fdocs.chain.link\u002Fvrf) that anyone can verify against the oracle's public key\n4. Both the value and the proof are posted back onchain in a single transaction\n5. The contract verifies the proof before using the value\n\nThe critical property: because the proof ties the random value to the oracle's private key and the request seed, the oracle cannot cherry-pick convenient values. Any deviation is mathematically detectable.\n\n### When to Use VRF vs HMAC-Based PF\n\n| Use case | Best fit | Why |\n|---|---|---|\n| Centralized dice\u002Fcrash | HMAC-based PF | Simpler, cheaper, same guarantees |\n| Onchain lottery | Chainlink VRF | Trustless, no central operator |\n| NFT trait assignment | Chainlink VRF | Non-manipulable rarity |\n| Centralized blackjack | HMAC-based PF | Chainlink VRF too expensive per card |\n| DeFi game with high jackpot | Chainlink VRF | Miner manipulation risk too high |\n\nMost crypto casinos in 2026 still use HMAC-based PF because it's fast, cheap, and already well-understood. VRF is where onchain DeFi, NFTs, and fully decentralized gaming shine. Our [provably fair Bitcoin games](\u002Fblog\u002Fprovably-fair-bitcoin-games) ranking filters specifically by which PF implementation each casino uses.\n\nIf you want to stress-test these concepts on a live casino, the [provably fair directory](\u002Fcasino\u002Fprovably-fair) lists implementations you can probe without depositing first — most expose server-seed hashes on a public endpoint.\n\n## Attack Surface of PF RNGs\n\nA cryptographically perfect PF RNG can still be broken by bad implementation. Here's what survives the math.\n\n### Biased Seed Pool Attack\n\nThe most realistic attack — and one reason client seed rotation matters.\n\nA dishonest casino generates thousands of candidate server seeds in advance. For each, they compute outcomes against common client seed patterns (default browser formats, frequent words). They deploy only seeds that happen to produce more losses than wins against predictable client seeds.\n\nEvery deployed seed still hashes correctly to its pre-committed hash. The commit-reveal math passes. But the pool of available seeds was cherry-picked before any player saw them, and the long-run house edge quietly exceeds the stated RTP.\n\n#### Why Rotation Defeats It\n\nBiased-seed attacks require the casino to know your future client seed *before* committing the server seed. Rotate your client seed every 50-100 bets and the casino's pre-computation becomes useless — they committed to a server seed before knowing the new client seed, so they can't steer outcomes.\n\nThis is why legitimate casinos let you rotate instantly. A PF casino that refuses client seed rotation (or auto-regenerates the client seed on their schedule, not yours) is signaling the attack surface is open. The [client seed vs server seed](\u002Fblog\u002Fclient-seed-vs-server-seed) guide covers the full rotation workflow.\n\n### Weak Entropy Sources\n\nIf the server seed generation uses predictable entropy, the commit-reveal protocol still runs but the attacker can predict seeds.\n\n#### The Math.random Trap\n\nJavaScript's `Math.random()` is a linear congruential generator variant. After observing ~700 consecutive outputs, an attacker can reconstruct the full internal state and predict every subsequent output. If a PF casino uses Math.random for server seed generation:\n\n1. Attacker plays 700+ rounds, collecting each revealed server seed\n2. Attacker reconstructs the PRNG state\n3. Attacker predicts the next hashed server seed *before* it's committed\n4. Attacker bets with full knowledge of the outcome\n\nPrevention: casinos must use `crypto.randomBytes(32)` (Node.js), `crypto.getRandomValues(new Uint8Array(32))` (browser), or hardware RNG. The difference is one line of code but the security gap is total.\n\n### Implementation Red Flags\n\nShort checklist of signals that a PF RNG isn't safe:\n\n- No client seed rotation button, or rotation takes >5 seconds\n- Client seed is auto-regenerated by the casino on their schedule\n- Server seed history doesn't show the algorithm or slice width\n- Verification tool only works on the casino's own website (not locally)\n- No published hash algorithm — \"SHA-256 somewhere\" isn't enough; you need the exact formula\n- Revealed server seeds don't match their pre-committed hashes in any round\n\nAny one of these suggests the PF claim is marketing varnish on top of a regular RNG. For a side-by-side on which casinos actually publish their PF code, see the [provably fair Bitcoin games](\u002Fblog\u002Fprovably-fair-bitcoin-games) ranking.\n\n## Try It Yourself — Interactive Verifier\n\nThe math stops being abstract the moment you run it on your own seeds. Paste any four values from your casino's fairness panel into the verifier below — everything executes in your browser via the Web Crypto API, no data is sent to our server.\n\n::inline-provably-fair-verifier\n::\n\nA practical tip: if you don't have a real PF casino bet handy, try these throwaway test values to see a verified round:\n\n- Server seed hash: `bf3c0a9b0f4b3c8e8f4f0c5f0c4e8b7d8f3e2a1c9f6e3b7c4d5a8e2f9b1c6d3a` (example only — won't match real hashes)\n- Server seed: `f4a9c2e1b7d8e3c5a1b9f6d2e8c4a7b3e9d1c6a2b5f8e4c7a3b6e1d9c2a5b8f4`\n- Client seed: `demo-player`\n- Nonce: `1`\n\nThe result shows a PASS \u002F FAIL verdict on hash match plus the reconstructed dice and crash outcomes. The same logic runs behind the [Aviator provably fair calculator](\u002Fblog\u002Fprovably-fair-aviator-calculator) for Spribe's crash-style game, and our full verifier at [the provably fair hub](\u002Fcasino\u002Fprovably-fair) covers every mainstream PF casino. For sizing bets against a known RTP once you've confirmed the RNG is legit, pair it with our [RTP calculator](\u002Fcasino\u002Frtp-calculator), [house edge calculator](\u002Fcasino\u002Fhouse-edge-calculator), and [bankroll calculator](\u002Fcasino\u002Fbankroll-calculator).\n\n**Bottom line:** the math is bulletproof only if the casino actually publishes the hash before the bet. Double-check every implementation against the [provably fair hub](\u002Fcasino\u002Fprovably-fair) — we note whether each venue locks in the seed correctly and where the hash is exposed.\n\n## FAQ",[28,31,34,37,40,43,46,49,52,55,58,61,64,67,70],{"answer":29,"question":30},"A provably fair RNG feeds three inputs — the casino's server seed (hidden behind a SHA-256 hash), your client seed, and a nonce — into HMAC-SHA256. The hex output is then mapped to a dice roll, crash multiplier, or card. Because the server seed's hash is published before your bet, the casino can't change it afterwards, and the whole computation is deterministic: anyone who has the three inputs can reproduce the exact result in a browser.","How does provably fair random number generation actually work?",{"answer":32,"question":33},"Pseudocode: `hex = HMAC_SHA256(server_seed, client_seed + ':' + nonce); dice = (parseInt(hex.slice(0,10), 16) % 1_000_000) \u002F 10_000;`. The HMAC call uses the server seed as the key and the client-seed+nonce string as the message. Slice the first 10 hex characters, convert to decimal, modulo by 1,000,000, divide by 10,000 — you get a 0-99.9999 dice roll. Different games (crash, cards) change only the mapping, never the HMAC itself.","How to generate random number pseudocode for a provably fair game?",{"answer":35,"question":36},"No — not without the server seed, which stays hidden until the casino rotates it. HMAC-SHA256 is a one-way function: even knowing the output and the message, you can't recover the key in realistic time. The only way to predict outcomes is if the casino leaks the active server seed before the round ends, which would be immediately detectable because the revealed seed wouldn't hash to the pre-committed hash. In 2026 there are no known practical attacks on SHA-256 that would change this.","Can provably fair be predicted?",{"answer":38,"question":39},"The algorithm itself can't be cracked — SHA-256 and HMAC-SHA256 have no practical preimage or key-recovery attacks. The realistic attack surfaces are all implementation bugs: a casino using weak entropy (like JavaScript's Math.random) for server seed generation, a casino refusing to rotate seeds, or biased seed pools where the casino pre-computes losing outcomes for common client seeds. None of these break the math — they break the setup around it. Rotate your client seed every 50-100 bets and you defeat all known attacks.","How to crack provably fair algorithm?",{"answer":41,"question":42},"HMAC-SHA256 is not technically a CSPRNG on its own, but it behaves as one when keyed with a cryptographically random server seed. The output is indistinguishable from random to anyone who doesn't know the key, which is exactly the property provably fair gambling requires. NIST SP 800-90A Rev 1 defines HMAC_DRBG (HMAC-based deterministic random bit generator), which many PF casinos implement as their underlying number generator.","Is HMAC-SHA256 really a CSPRNG?",{"answer":44,"question":45},"You don't need Excel for this — use JavaScript in the browser console. Run a loop: `for (let i=0; i\u003C10000; i++) console.log(await pfDice(serverSeed, clientSeed, i))` using the same HMAC-SHA256 + dice mapping the casino uses. Plot the histogram — it should be uniform across 0-99.99 with no visible bias. Excel's `RAND()` isn't cryptographic and won't match a PF casino's output; use it only for sanity-checking the distribution shape, not the exact values.","How to generate 10,000 random numbers in Excel for testing a PF casino?",{"answer":47,"question":48},"HMAC is a keyed hash function — it lets the server seed act as a secret 'key' that must be known to reproduce the output. Plain SHA-256 doesn't have this key property: SHA-256(server_seed + client_seed + nonce) would still work deterministically, but it's vulnerable to length-extension attacks where a malicious party could compute a new hash with a longer message without knowing the key. HMAC wraps SHA-256 in a construction that defeats length extension, which is why every modern PF casino uses HMAC.","Why use HMAC instead of plain SHA-256?",{"answer":50,"question":51},"Not natively. Blockchains are deterministic — every validator must produce the same result from the same inputs, so there's no built-in source of entropy. If a dApp tried to use block hash, timestamp, or prevrandao as randomness, miners could manipulate them. The solution is oracle-delivered randomness like Chainlink VRF, which generates the number offchain with a verifiable cryptographic proof and posts both to the chain. For onchain NFT drops, lotteries, and some crypto casinos, VRF has largely replaced naive blockhash schemes.","Can a blockchain generate provably fair random numbers?",{"answer":53,"question":54},"A PRNG (pseudo-random number generator) is deterministic but not secure — predictable given enough output (e.g. Math.random). A CSPRNG (cryptographically secure PRNG) is deterministic *and* unpredictable even given prior outputs, using cryptographic primitives like HMAC-DRBG, AES-CTR, or ChaCha20. A PF RNG is a CSPRNG wrapped in a commit-reveal protocol: the casino publishes the seed hash before you bet, so you can verify after the round that the casino didn't change the seed. PF RNG = CSPRNG + transparency.","What's the difference between PRNG, CSPRNG, and PF RNG?",{"answer":56,"question":57},"Rarely. Most major slot studios (Pragmatic Play, NetEnt, Play'n GO, Hacksaw) use proprietary CSPRNGs audited by eCOGRA or iTech Labs — not provably fair. The mechanics are too complex (cascading reels, bonus triggers, feature buys) to map cleanly to a single HMAC output. Provably fair slots exist — BGaming, Spribe, and Turbo ship some titles with PF — but they're simpler designs. For a deeper comparison of the two trust models, see the provably fair vs RNG certified breakdown.","Does provably fair work for slot machines?",{"answer":59,"question":60},"Stake-style PF dice takes the HMAC-SHA256 output, slices the first 5 hex characters (sometimes 8-10), converts to a decimal, then applies modulo 1,000,000 and divides by 10,000 to produce a 0-99.9999 value. If the result is above 99.9999 (a statistical rarity), the slice advances to the next chunk of the hex string. This keeps the distribution uniform without bias from hex truncation. Verification tools need the exact slice width and divisor for each casino, which is why a generic verifier sometimes shows a slightly different number than the casino's UI.","How does PF dice mapping work?",{"answer":62,"question":63},"Crash uses a different formula. The first 8 hex characters of the HMAC output are converted to an integer `h`. If `h` is divisible by a specific house-edge factor (33 on Stake), the crash multiplier is 1.00 (instant bust). Otherwise the multiplier is `floor((100 * 2^52 - h) \u002F (2^52 - h)) \u002F 100`. This produces a distribution skewed toward low multipliers (most rounds bust before 2x) but with a long right tail that rewards patient bets. The RTP is ~99% if the house-edge factor is 1%.","How does PF crash mapping work?",{"answer":65,"question":66},"The entire protocol collapses. Math.random in JavaScript is seeded from the system clock and produces predictable output — a player who knows the approximate server time can pre-compute all future server seeds and win every bet. Any PF casino using non-cryptographic entropy (Math.random, time-based seeds, predictable counters) is effectively unaudited, even if it displays seed hashes. Reputable casinos use crypto.randomBytes (Node.js) or crypto.getRandomValues (browsers) backed by OS entropy pools.","What happens if the casino uses Math.random for its server seed?",{"answer":68,"question":69},"For the hash-match check, yes — SHA-256 is universal. For the game outcome, partially. Most PF dice sites use the same HMAC-SHA256 + first-5-hex slice formula, so a generic dice verifier reproduces Stake, Primedice, Rainbet, and most Originals correctly. Crash and blackjack mappings vary by casino, and some use HMAC-SHA512 instead of SHA-256 for card games. When the hash matches but the outcome number differs, switch to the casino's official verifier or check the fairness docs.","Can I use one verifier for all provably fair casinos?",{"answer":71,"question":72},"For the foreseeable future, yes. SHA-256 would need roughly 2^128 quantum operations to break with Grover's algorithm — still computationally infeasible. HMAC-SHA256 adds another layer on top. The NIST post-quantum standardization effort hasn't targeted SHA-256 or HMAC because they remain secure even against large-scale quantum computers. Public-key cryptography (RSA, ECDSA) is what's vulnerable to quantum attacks, not symmetric hashes. Provably fair RNG will remain safe into the 2030s and beyond barring a theoretical breakthrough.","Is provably fair RNG safe long-term against quantum computers?",[74,75,76,77],"ru","de","tr","en",{"data":79,"body":80},{},{"type":81,"children":82},"root",[83,92,115,120,132,138,143,285,290,560,596,603,668,674,693,716,730,736,748,754,766,778,783,798,804,809,851,872,878,897,1031,1058,1064,1069,1075,1080,1291,1296,1308,1320,1333,1337,1343,1348,1356,1386,1394,1403,1411,1428,1436,1445,1453,1458,1466,1486,1498,1504,1509,1736,1748,1754,1759,1765,1770,2272,2284,2289,2293,2299,2304,2827,2847,2852,2858,2863,2872,2892,2898,2903,2909,2920,2943,2948,2954,2959,2989,2999,3005,3010,3016,3021,3068,3073,3079,3089,3127,3132,3138,3251,3264,3277,3283,3288,3294,3299,3304,3309,3316,3327,3340,3346,3351,3357,3369,3398,3419,3425,3430,3463,3474,3480,3485,3489,3494,3542,3585,3602],{"type":84,"tag":85,"props":86,"children":88},"element","h2",{"id":87},"provably-fair-random-number-generation-explained-2026",[89],{"type":90,"value":91},"text","Provably Fair Random Number Generation Explained (2026)",{"type":84,"tag":93,"props":94,"children":95},"p",{},[96,98,105,107,113],{"type":90,"value":97},"You just placed a 0.5 BTC bet on a crypto dice game. The screen rolls ",{"type":84,"tag":99,"props":100,"children":102},"code",{"className":101},[],[103],{"type":90,"value":104},"37.42",{"type":90,"value":106}," and you lose. You open the fairness panel and it shows a server seed hash, your client seed, and a nonce — four values that supposedly prove nothing was rigged. But how did those four values ",{"type":84,"tag":108,"props":109,"children":110},"em",{},[111],{"type":90,"value":112},"become",{"type":90,"value":114}," 37.42? What actually turned random hex characters into a specific dice roll?",{"type":84,"tag":93,"props":116,"children":117},{},[118],{"type":90,"value":119},"Here's the thing: the entire \"provably fair\" promise hinges on one specific act — converting cryptographic hash output into game outcomes. Miss how that conversion works and provably fair feels like magic marketing. Understand it and you can audit any PF casino in about 60 seconds, spot fake implementations on sight, and know exactly which attacks the protocol does and doesn't defeat.",{"type":84,"tag":93,"props":121,"children":122},{},[123,125,130],{"type":90,"value":124},"This guide walks you through ",{"type":84,"tag":126,"props":127,"children":128},"strong",{},[129],{"type":90,"value":18},{"type":90,"value":131}," the way a developer would build one in 2026 — the CSPRNG primitives under the hood, the HMAC-SHA256 formula that turns seeds into numbers, the different mapping schemes for dice, crash, and cards, and the attack surface that survives even when the math is perfect. By the end you'll know why PF RNGs are cryptographically unbreakable, which implementation bugs still ruin them, and when blockchain randomness (Chainlink VRF) kicks in instead.",{"type":84,"tag":85,"props":133,"children":135},{"id":134},"tldr-how-pf-rngs-actually-generate-numbers",[136],{"type":90,"value":137},"TL;DR — How PF RNGs Actually Generate Numbers",{"type":84,"tag":93,"props":139,"children":140},{},[141],{"type":90,"value":142},"Every provably fair game uses the same core RNG primitive, only the output mapping changes. Here's the 60-second version.",{"type":84,"tag":144,"props":145,"children":146},"table",{},[147,170],{"type":84,"tag":148,"props":149,"children":150},"thead",{},[151],{"type":84,"tag":76,"props":152,"children":153},{},[154,160,165],{"type":84,"tag":155,"props":156,"children":157},"th",{},[158],{"type":90,"value":159},"Step",{"type":84,"tag":155,"props":161,"children":162},{},[163],{"type":90,"value":164},"What happens",{"type":84,"tag":155,"props":166,"children":167},{},[168],{"type":90,"value":169},"Who controls it",{"type":84,"tag":171,"props":172,"children":173},"tbody",{},[174,193,210,228,250,267],{"type":84,"tag":76,"props":175,"children":176},{},[177,183,188],{"type":84,"tag":178,"props":179,"children":180},"td",{},[181],{"type":90,"value":182},"1. Generate server seed",{"type":84,"tag":178,"props":184,"children":185},{},[186],{"type":90,"value":187},"Casino's CSPRNG outputs a 32-64 byte random string",{"type":84,"tag":178,"props":189,"children":190},{},[191],{"type":90,"value":192},"Casino",{"type":84,"tag":76,"props":194,"children":195},{},[196,201,206],{"type":84,"tag":178,"props":197,"children":198},{},[199],{"type":90,"value":200},"2. Hash and publish",{"type":84,"tag":178,"props":202,"children":203},{},[204],{"type":90,"value":205},"SHA-256(server_seed) is shown to you before the round",{"type":84,"tag":178,"props":207,"children":208},{},[209],{"type":90,"value":192},{"type":84,"tag":76,"props":211,"children":212},{},[213,218,223],{"type":84,"tag":178,"props":214,"children":215},{},[216],{"type":90,"value":217},"3. Collect client seed + nonce",{"type":84,"tag":178,"props":219,"children":220},{},[221],{"type":90,"value":222},"Your browser adds a client seed; nonce is the round counter",{"type":84,"tag":178,"props":224,"children":225},{},[226],{"type":90,"value":227},"You + protocol",{"type":84,"tag":76,"props":229,"children":230},{},[231,236,245],{"type":84,"tag":178,"props":232,"children":233},{},[234],{"type":90,"value":235},"4. Compute HMAC",{"type":84,"tag":178,"props":237,"children":238},{},[239],{"type":84,"tag":99,"props":240,"children":242},{"className":241},[],[243],{"type":90,"value":244},"hex = HMAC-SHA256(server_seed, client_seed : nonce)",{"type":84,"tag":178,"props":246,"children":247},{},[248],{"type":90,"value":249},"Deterministic",{"type":84,"tag":76,"props":251,"children":252},{},[253,258,263],{"type":84,"tag":178,"props":254,"children":255},{},[256],{"type":90,"value":257},"5. Map hex to outcome",{"type":84,"tag":178,"props":259,"children":260},{},[261],{"type":90,"value":262},"Slice + modulo + divide = dice roll, crash multiplier, or card",{"type":84,"tag":178,"props":264,"children":265},{},[266],{"type":90,"value":249},{"type":84,"tag":76,"props":268,"children":269},{},[270,275,280],{"type":84,"tag":178,"props":271,"children":272},{},[273],{"type":90,"value":274},"6. Reveal and verify",{"type":84,"tag":178,"props":276,"children":277},{},[278],{"type":90,"value":279},"After rotation the raw seed is revealed; anyone can re-run step 4",{"type":84,"tag":178,"props":281,"children":282},{},[283],{"type":90,"value":284},"You",{"type":84,"tag":93,"props":286,"children":287},{},[288],{"type":90,"value":289},"The math is:",{"type":84,"tag":93,"props":291,"children":292},{},[293],{"type":84,"tag":294,"props":295,"children":298},"span",{"className":296},[297],"katex",[299,398],{"type":84,"tag":294,"props":300,"children":303},{"className":301},[302],"katex-mathml",[304],{"type":84,"tag":305,"props":306,"children":308},"math",{"xmlns":307},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML",[309],{"type":84,"tag":310,"props":311,"children":312},"semantics",{},[313,391],{"type":84,"tag":314,"props":315,"children":316},"mrow",{},[317,323,329,335,343,348,352,357,362,367,372,377,382,387],{"type":84,"tag":318,"props":319,"children":320},"mtext",{},[321],{"type":90,"value":322},"outcome",{"type":84,"tag":324,"props":325,"children":326},"mo",{},[327],{"type":90,"value":328},"=",{"type":84,"tag":330,"props":331,"children":332},"mi",{},[333],{"type":90,"value":334},"f",{"type":84,"tag":324,"props":336,"children":340},{"fence":337,"stretchy":338,"minsize":339,"maxsize":339},"false","true","1.2em",[341],{"type":90,"value":342},"(",{"type":84,"tag":318,"props":344,"children":345},{},[346],{"type":90,"value":347},"HMAC-SHA256",{"type":84,"tag":324,"props":349,"children":350},{"stretchy":337},[351],{"type":90,"value":342},{"type":84,"tag":318,"props":353,"children":354},{},[355],{"type":90,"value":356},"server_seed",{"type":84,"tag":324,"props":358,"children":359},{"separator":338},[360],{"type":90,"value":361},",",{"type":84,"tag":318,"props":363,"children":364},{},[365],{"type":90,"value":366},"  ",{"type":84,"tag":318,"props":368,"children":369},{},[370],{"type":90,"value":371},"client_seed",{"type":84,"tag":324,"props":373,"children":374},{},[375],{"type":90,"value":376},":",{"type":84,"tag":318,"props":378,"children":379},{},[380],{"type":90,"value":381},"nonce",{"type":84,"tag":324,"props":383,"children":384},{"stretchy":337},[385],{"type":90,"value":386},")",{"type":84,"tag":324,"props":388,"children":389},{"fence":337,"stretchy":338,"minsize":339,"maxsize":339},[390],{"type":90,"value":386},{"type":84,"tag":392,"props":393,"children":395},"annotation",{"encoding":394},"application\u002Fx-tex",[396],{"type":90,"value":397},"\\text{outcome} = f\\big(\\text{HMAC-SHA256}(\\text{server\\_seed},\\; \\text{client\\_seed} : \\text{nonce})\\big)",{"type":84,"tag":294,"props":399,"children":402},{"className":400,"ariaHidden":338},[401],"katex-html",[403,440,528],{"type":84,"tag":294,"props":404,"children":407},{"className":405},[406],"base",[408,414,424,430,436],{"type":84,"tag":294,"props":409,"children":413},{"className":410,"style":412},[411],"strut","height:0.6151em;",[],{"type":84,"tag":294,"props":415,"children":418},{"className":416},[417,90],"mord",[419],{"type":84,"tag":294,"props":420,"children":422},{"className":421},[417],[423],{"type":90,"value":322},{"type":84,"tag":294,"props":425,"children":429},{"className":426,"style":428},[427],"mspace","margin-right:0.2778em;",[],{"type":84,"tag":294,"props":431,"children":434},{"className":432},[433],"mrel",[435],{"type":90,"value":328},{"type":84,"tag":294,"props":437,"children":439},{"className":438,"style":428},[427],[],{"type":84,"tag":294,"props":441,"children":443},{"className":442},[406],[444,449,456,467,476,482,491,497,501,506,515,519,524],{"type":84,"tag":294,"props":445,"children":448},{"className":446,"style":447},[411],"height:1.2em;vertical-align:-0.35em;",[],{"type":84,"tag":294,"props":450,"children":454},{"className":451,"style":453},[417,452],"mathnormal","margin-right:0.1076em;",[455],{"type":90,"value":334},{"type":84,"tag":294,"props":457,"children":459},{"className":458},[417],[460],{"type":84,"tag":294,"props":461,"children":465},{"className":462},[463,464],"delimsizing","size1",[466],{"type":90,"value":342},{"type":84,"tag":294,"props":468,"children":470},{"className":469},[417,90],[471],{"type":84,"tag":294,"props":472,"children":474},{"className":473},[417],[475],{"type":90,"value":347},{"type":84,"tag":294,"props":477,"children":480},{"className":478},[479],"mopen",[481],{"type":90,"value":342},{"type":84,"tag":294,"props":483,"children":485},{"className":484},[417,90],[486],{"type":84,"tag":294,"props":487,"children":489},{"className":488},[417],[490],{"type":90,"value":356},{"type":84,"tag":294,"props":492,"children":495},{"className":493},[494],"mpunct",[496],{"type":90,"value":361},{"type":84,"tag":294,"props":498,"children":500},{"className":499,"style":428},[427],[],{"type":84,"tag":294,"props":502,"children":505},{"className":503,"style":504},[427],"margin-right:0.1667em;",[],{"type":84,"tag":294,"props":507,"children":509},{"className":508},[417,90],[510],{"type":84,"tag":294,"props":511,"children":513},{"className":512},[417],[514],{"type":90,"value":371},{"type":84,"tag":294,"props":516,"children":518},{"className":517,"style":428},[427],[],{"type":84,"tag":294,"props":520,"children":522},{"className":521},[433],[523],{"type":90,"value":376},{"type":84,"tag":294,"props":525,"children":527},{"className":526,"style":428},[427],[],{"type":84,"tag":294,"props":529,"children":531},{"className":530},[406],[532,536,545,551],{"type":84,"tag":294,"props":533,"children":535},{"className":534,"style":447},[411],[],{"type":84,"tag":294,"props":537,"children":539},{"className":538},[417,90],[540],{"type":84,"tag":294,"props":541,"children":543},{"className":542},[417],[544],{"type":90,"value":381},{"type":84,"tag":294,"props":546,"children":549},{"className":547},[548],"mclose",[550],{"type":90,"value":386},{"type":84,"tag":294,"props":552,"children":554},{"className":553},[417],[555],{"type":84,"tag":294,"props":556,"children":558},{"className":557},[463,464],[559],{"type":90,"value":386},{"type":84,"tag":93,"props":561,"children":562},{},[563,565,570,572,578,580,586,588,594],{"type":90,"value":564},"Where ",{"type":84,"tag":99,"props":566,"children":568},{"className":567},[],[569],{"type":90,"value":334},{"type":90,"value":571}," is a game-specific mapping function — ",{"type":84,"tag":99,"props":573,"children":575},{"className":574},[],[576],{"type":90,"value":577},"f_dice",{"type":90,"value":579}," returns 0-99.99, ",{"type":84,"tag":99,"props":581,"children":583},{"className":582},[],[584],{"type":90,"value":585},"f_crash",{"type":90,"value":587}," returns a multiplier, ",{"type":84,"tag":99,"props":589,"children":591},{"className":590},[],[592],{"type":90,"value":593},"f_cards",{"type":90,"value":595}," returns shuffled deck positions. The HMAC part is identical across every PF casino in the world.",{"type":84,"tag":597,"props":598,"children":600},"h3",{"id":599},"key-numbers-you-need-to-know",[601],{"type":90,"value":602},"Key Numbers You Need to Know",{"type":84,"tag":604,"props":605,"children":606},"ul",{},[607,618,628,638,648,658],{"type":84,"tag":608,"props":609,"children":610},"li",{},[611,616],{"type":84,"tag":126,"props":612,"children":613},{},[614],{"type":90,"value":615},"3 inputs",{"type":90,"value":617},": server seed + client seed + nonce produce every outcome",{"type":84,"tag":608,"props":619,"children":620},{},[621,626],{"type":84,"tag":126,"props":622,"children":623},{},[624],{"type":90,"value":625},"64 hex chars",{"type":90,"value":627},": length of a SHA-256 \u002F HMAC-SHA256 output",{"type":84,"tag":608,"props":629,"children":630},{},[631,636],{"type":84,"tag":126,"props":632,"children":633},{},[634],{"type":90,"value":635},"128 hex chars",{"type":90,"value":637},": length of HMAC-SHA512 (used by BC.Game and PF blackjack)",{"type":84,"tag":608,"props":639,"children":640},{},[641,646],{"type":84,"tag":126,"props":642,"children":643},{},[644],{"type":90,"value":645},"~2^256 operations",{"type":90,"value":647},": what it would take to break HMAC-SHA256 — astronomically out of reach",{"type":84,"tag":608,"props":649,"children":650},{},[651,656],{"type":84,"tag":126,"props":652,"children":653},{},[654],{"type":90,"value":655},"0.00-99.99",{"type":90,"value":657},": standard dice range after mapping",{"type":84,"tag":608,"props":659,"children":660},{},[661,666],{"type":84,"tag":126,"props":662,"children":663},{},[664],{"type":90,"value":665},"1.00x to ∞",{"type":90,"value":667},": standard crash multiplier range (bounded in practice by float precision)",{"type":84,"tag":597,"props":669,"children":671},{"id":670},"fair-profitable",[672],{"type":90,"value":673},"Fair ≠ Profitable",{"type":84,"tag":93,"props":675,"children":676},{},[677,679,684,686,691],{"type":90,"value":678},"The RNG being provably fair tells you the casino couldn't manipulate the outcome ",{"type":84,"tag":108,"props":680,"children":681},{},[682],{"type":90,"value":683},"after",{"type":90,"value":685}," you bet. It does ",{"type":84,"tag":126,"props":687,"children":688},{},[689],{"type":90,"value":690},"not",{"type":90,"value":692}," tell you:",{"type":84,"tag":604,"props":694,"children":695},{},[696,701,706,711],{"type":84,"tag":608,"props":697,"children":698},{},[699],{"type":90,"value":700},"Whether the house edge is reasonable (check RTP separately)",{"type":84,"tag":608,"props":702,"children":703},{},[704],{"type":90,"value":705},"Whether the casino will honor withdrawals",{"type":84,"tag":608,"props":707,"children":708},{},[709],{"type":90,"value":710},"Whether bonuses and wagering terms are honest",{"type":84,"tag":608,"props":712,"children":713},{},[714],{"type":90,"value":715},"Whether the server seed pool was unbiased before it was committed",{"type":84,"tag":93,"props":717,"children":718},{},[719,721,728],{"type":90,"value":720},"We'll cover the full attack surface below. For a broader comparison with traditional certification, see our ",{"type":84,"tag":722,"props":723,"children":725},"a",{"href":724},"\u002Fblog\u002Fprovably-fair-vs-rng-certified",[726],{"type":90,"value":727},"provably fair vs RNG certified",{"type":90,"value":729}," guide.",{"type":84,"tag":85,"props":731,"children":733},{"id":732},"what-makes-an-rng-provably-fair",[734],{"type":90,"value":735},"What Makes an RNG \"Provably Fair\"",{"type":84,"tag":93,"props":737,"children":738},{},[739,741,746],{"type":90,"value":740},"Before we get to the formula, it helps to separate ",{"type":84,"tag":108,"props":742,"children":743},{},[744],{"type":90,"value":745},"provably fair",{"type":90,"value":747}," from the broader RNG world. PF is a specific upgrade to CSPRNGs, not a replacement.",{"type":84,"tag":597,"props":749,"children":751},{"id":750},"the-commit-reveal-primitive",[752],{"type":90,"value":753},"The Commit-Reveal Primitive",{"type":84,"tag":93,"props":755,"children":756},{},[757,759,764],{"type":90,"value":758},"The whole trick behind provably fair is a cryptographic pattern called ",{"type":84,"tag":126,"props":760,"children":761},{},[762],{"type":90,"value":763},"commit-reveal",{"type":90,"value":765},".",{"type":84,"tag":93,"props":767,"children":768},{},[769,771,776],{"type":90,"value":770},"Before the round starts, the casino commits to a specific server seed by publishing its SHA-256 hash. The hash is a 64-character fingerprint that uniquely identifies the seed without revealing it. Because SHA-256 has no practical collision attacks, the casino can't later find a ",{"type":84,"tag":108,"props":772,"children":773},{},[774],{"type":90,"value":775},"different",{"type":90,"value":777}," seed that produces the same hash — they're locked in.",{"type":84,"tag":93,"props":779,"children":780},{},[781],{"type":90,"value":782},"After the round (or after you rotate seeds), the raw server seed is revealed. You hash it yourself. If your computed hash matches what was published before the round, the casino proved they didn't swap seeds mid-round. Combined with your client seed (which they didn't know in advance), this makes per-round outcome manipulation cryptographically impossible.",{"type":84,"tag":93,"props":784,"children":785},{},[786,788,796],{"type":90,"value":787},"The commit-reveal layer is what separates PF from any other CSPRNG. A traditional RNG-certified casino also uses a CSPRNG — but nothing stops them from swapping it out in production, as ",{"type":84,"tag":722,"props":789,"children":793},{"href":790,"rel":791},"https:\u002F\u002Fwww.itechlabs.com",[792],"nofollow",[794],{"type":90,"value":795},"iTech Labs audits only prove statistical properties",{"type":90,"value":797},", not runtime identity.",{"type":84,"tag":597,"props":799,"children":801},{"id":800},"hmac-as-the-rng-primitive",[802],{"type":90,"value":803},"HMAC as the RNG Primitive",{"type":84,"tag":93,"props":805,"children":806},{},[807],{"type":90,"value":808},"HMAC-SHA256 is the actual random number generator inside every PF round. Here's why it works:",{"type":84,"tag":604,"props":810,"children":811},{},[812,821,831,841],{"type":84,"tag":608,"props":813,"children":814},{},[815,819],{"type":84,"tag":126,"props":816,"children":817},{},[818],{"type":90,"value":249},{"type":90,"value":820},": Given the same inputs, HMAC always produces the same output. This is what lets you verify.",{"type":84,"tag":608,"props":822,"children":823},{},[824,829],{"type":84,"tag":126,"props":825,"children":826},{},[827],{"type":90,"value":828},"One-way",{"type":90,"value":830},": Given the output, you can't recover the server seed (the key). This is what keeps the outcome unpredictable.",{"type":84,"tag":608,"props":832,"children":833},{},[834,839],{"type":84,"tag":126,"props":835,"children":836},{},[837],{"type":90,"value":838},"Uniform",{"type":90,"value":840},": HMAC outputs are indistinguishable from random 256-bit strings. This is what keeps the game unbiased.",{"type":84,"tag":608,"props":842,"children":843},{},[844,849],{"type":84,"tag":126,"props":845,"children":846},{},[847],{"type":90,"value":848},"Keyed",{"type":90,"value":850},": The server seed acts as a secret that must be known to reproduce the output. This is what prevents tampering.",{"type":84,"tag":93,"props":852,"children":853},{},[854,856,861,863,870],{"type":90,"value":855},"Technically, HMAC-SHA256 isn't a CSPRNG by itself — it's a message authentication code. But when the key (server seed) is generated from a real entropy source, the construction is equivalent to a CSPRNG for all practical purposes. NIST formalized this as ",{"type":84,"tag":126,"props":857,"children":858},{},[859],{"type":90,"value":860},"HMAC_DRBG",{"type":90,"value":862}," in ",{"type":84,"tag":722,"props":864,"children":867},{"href":865,"rel":866},"https:\u002F\u002Fcsrc.nist.gov\u002Fpublications\u002Fdetail\u002Fsp\u002F800-90a\u002Frev-1\u002Ffinal",[792],[868],{"type":90,"value":869},"SP 800-90A Rev 1",{"type":90,"value":871},", and PF casinos essentially reimplement that standard with the addition of public seed commitment.",{"type":84,"tag":597,"props":873,"children":875},{"id":874},"why-csprngs-matter-not-mathrandom",[876],{"type":90,"value":877},"Why CSPRNGs Matter (Not Math.random)",{"type":84,"tag":93,"props":879,"children":880},{},[881,883,887,889,895],{"type":90,"value":882},"Every legitimate PF casino generates its server seed with a cryptographically secure RNG — ",{"type":84,"tag":126,"props":884,"children":885},{},[886],{"type":90,"value":690},{"type":90,"value":888}," JavaScript's ",{"type":84,"tag":99,"props":890,"children":892},{"className":891},[],[893],{"type":90,"value":894},"Math.random()",{"type":90,"value":896},". The difference matters more than most players realize:",{"type":84,"tag":144,"props":898,"children":899},{},[900,921],{"type":84,"tag":148,"props":901,"children":902},{},[903],{"type":84,"tag":76,"props":904,"children":905},{},[906,911,916],{"type":84,"tag":155,"props":907,"children":908},{},[909],{"type":90,"value":910},"Generator",{"type":84,"tag":155,"props":912,"children":913},{},[914],{"type":90,"value":915},"Predictable after seeing output?",{"type":84,"tag":155,"props":917,"children":918},{},[919],{"type":90,"value":920},"Acceptable for PF?",{"type":84,"tag":171,"props":922,"children":923},{},[924,947,971,993,1015],{"type":84,"tag":76,"props":925,"children":926},{},[927,937,942],{"type":84,"tag":178,"props":928,"children":929},{},[930,935],{"type":84,"tag":99,"props":931,"children":933},{"className":932},[],[934],{"type":90,"value":894},{"type":90,"value":936}," (V8 in Chrome)",{"type":84,"tag":178,"props":938,"children":939},{},[940],{"type":90,"value":941},"Yes, after ~700 outputs",{"type":84,"tag":178,"props":943,"children":944},{},[945],{"type":90,"value":946},"Never",{"type":84,"tag":76,"props":948,"children":949},{},[950,961,966],{"type":84,"tag":178,"props":951,"children":952},{},[953,955],{"type":90,"value":954},"Linux ",{"type":84,"tag":99,"props":956,"children":958},{"className":957},[],[959],{"type":90,"value":960},"\u002Fdev\u002Furandom",{"type":84,"tag":178,"props":962,"children":963},{},[964],{"type":90,"value":965},"No",{"type":84,"tag":178,"props":967,"children":968},{},[969],{"type":90,"value":970},"Yes",{"type":84,"tag":76,"props":972,"children":973},{},[974,985,989],{"type":84,"tag":178,"props":975,"children":976},{},[977,983],{"type":84,"tag":99,"props":978,"children":980},{"className":979},[],[981],{"type":90,"value":982},"crypto.getRandomValues",{"type":90,"value":984}," (browser)",{"type":84,"tag":178,"props":986,"children":987},{},[988],{"type":90,"value":965},{"type":84,"tag":178,"props":990,"children":991},{},[992],{"type":90,"value":970},{"type":84,"tag":76,"props":994,"children":995},{},[996,1007,1011],{"type":84,"tag":178,"props":997,"children":998},{},[999,1001],{"type":90,"value":1000},"Node.js ",{"type":84,"tag":99,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":90,"value":1006},"crypto.randomBytes",{"type":84,"tag":178,"props":1008,"children":1009},{},[1010],{"type":90,"value":965},{"type":84,"tag":178,"props":1012,"children":1013},{},[1014],{"type":90,"value":970},{"type":84,"tag":76,"props":1016,"children":1017},{},[1018,1023,1027],{"type":84,"tag":178,"props":1019,"children":1020},{},[1021],{"type":90,"value":1022},"Hardware RNG (Intel RDRAND)",{"type":84,"tag":178,"props":1024,"children":1025},{},[1026],{"type":90,"value":965},{"type":84,"tag":178,"props":1028,"children":1029},{},[1030],{"type":90,"value":970},{"type":84,"tag":93,"props":1032,"children":1033},{},[1034,1036,1041,1043,1048,1050,1056],{"type":90,"value":1035},"If a casino secretly seeds its server with ",{"type":84,"tag":99,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":90,"value":894},{"type":90,"value":1042},", a sophisticated attacker could reconstruct the seed from enough public outputs and predict every future round — even if the HMAC math is flawless. This is why checking your casino actually uses ",{"type":84,"tag":99,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":90,"value":1006},{"type":90,"value":1049}," or equivalent matters; the ",{"type":84,"tag":722,"props":1051,"children":1053},{"href":1052},"\u002Fblog\u002Fwhat-is-provably-fair-gambling",[1054],{"type":90,"value":1055},"what is provably fair gambling",{"type":90,"value":1057}," explainer covers the full chain of trust.",{"type":84,"tag":85,"props":1059,"children":1061},{"id":1060},"how-the-number-is-actually-generated",[1062],{"type":90,"value":1063},"How the Number Is Actually Generated",{"type":84,"tag":93,"props":1065,"children":1066},{},[1067],{"type":90,"value":1068},"Now the actual formula. This is the section to bookmark — everything above was context.",{"type":84,"tag":597,"props":1070,"children":1072},{"id":1071},"three-inputs-one-formula",[1073],{"type":90,"value":1074},"Three Inputs, One Formula",{"type":84,"tag":93,"props":1076,"children":1077},{},[1078],{"type":90,"value":1079},"Every provably fair round computes:",{"type":84,"tag":93,"props":1081,"children":1082},{},[1083],{"type":84,"tag":294,"props":1084,"children":1086},{"className":1085},[297],[1087,1158],{"type":84,"tag":294,"props":1088,"children":1090},{"className":1089},[302],[1091],{"type":84,"tag":305,"props":1092,"children":1093},{"xmlns":307},[1094],{"type":84,"tag":310,"props":1095,"children":1096},{},[1097,1153],{"type":84,"tag":314,"props":1098,"children":1099},{},[1100,1105,1109,1113,1117,1121,1125,1129,1133,1137,1141,1145,1149],{"type":84,"tag":318,"props":1101,"children":1102},{},[1103],{"type":90,"value":1104},"hex_output",{"type":84,"tag":324,"props":1106,"children":1107},{},[1108],{"type":90,"value":328},{"type":84,"tag":318,"props":1110,"children":1111},{},[1112],{"type":90,"value":347},{"type":84,"tag":324,"props":1114,"children":1115},{"stretchy":337},[1116],{"type":90,"value":342},{"type":84,"tag":318,"props":1118,"children":1119},{},[1120],{"type":90,"value":356},{"type":84,"tag":324,"props":1122,"children":1123},{"separator":338},[1124],{"type":90,"value":361},{"type":84,"tag":318,"props":1126,"children":1127},{},[1128],{"type":90,"value":366},{"type":84,"tag":318,"props":1130,"children":1131},{},[1132],{"type":90,"value":371},{"type":84,"tag":318,"props":1134,"children":1135},{},[1136],{"type":90,"value":366},{"type":84,"tag":324,"props":1138,"children":1139},{},[1140],{"type":90,"value":376},{"type":84,"tag":318,"props":1142,"children":1143},{},[1144],{"type":90,"value":366},{"type":84,"tag":318,"props":1146,"children":1147},{},[1148],{"type":90,"value":381},{"type":84,"tag":324,"props":1150,"children":1151},{"stretchy":337},[1152],{"type":90,"value":386},{"type":84,"tag":392,"props":1154,"children":1155},{"encoding":394},[1156],{"type":90,"value":1157},"\\text{hex\\_output} = \\text{HMAC-SHA256}(\\text{server\\_seed},\\; \\text{client\\_seed} \\; : \\; \\text{nonce})",{"type":84,"tag":294,"props":1159,"children":1161},{"className":1160,"ariaHidden":338},[401],[1162,1193,1268],{"type":84,"tag":294,"props":1163,"children":1165},{"className":1164},[406],[1166,1171,1180,1184,1189],{"type":84,"tag":294,"props":1167,"children":1170},{"className":1168,"style":1169},[411],"height:1.0044em;vertical-align:-0.31em;",[],{"type":84,"tag":294,"props":1172,"children":1174},{"className":1173},[417,90],[1175],{"type":84,"tag":294,"props":1176,"children":1178},{"className":1177},[417],[1179],{"type":90,"value":1104},{"type":84,"tag":294,"props":1181,"children":1183},{"className":1182,"style":428},[427],[],{"type":84,"tag":294,"props":1185,"children":1187},{"className":1186},[433],[1188],{"type":90,"value":328},{"type":84,"tag":294,"props":1190,"children":1192},{"className":1191,"style":428},[427],[],{"type":84,"tag":294,"props":1194,"children":1196},{"className":1195},[406],[1197,1202,1211,1216,1225,1230,1234,1238,1247,1251,1255,1260,1264],{"type":84,"tag":294,"props":1198,"children":1201},{"className":1199,"style":1200},[411],"height:1.06em;vertical-align:-0.31em;",[],{"type":84,"tag":294,"props":1203,"children":1205},{"className":1204},[417,90],[1206],{"type":84,"tag":294,"props":1207,"children":1209},{"className":1208},[417],[1210],{"type":90,"value":347},{"type":84,"tag":294,"props":1212,"children":1214},{"className":1213},[479],[1215],{"type":90,"value":342},{"type":84,"tag":294,"props":1217,"children":1219},{"className":1218},[417,90],[1220],{"type":84,"tag":294,"props":1221,"children":1223},{"className":1222},[417],[1224],{"type":90,"value":356},{"type":84,"tag":294,"props":1226,"children":1228},{"className":1227},[494],[1229],{"type":90,"value":361},{"type":84,"tag":294,"props":1231,"children":1233},{"className":1232,"style":428},[427],[],{"type":84,"tag":294,"props":1235,"children":1237},{"className":1236,"style":504},[427],[],{"type":84,"tag":294,"props":1239,"children":1241},{"className":1240},[417,90],[1242],{"type":84,"tag":294,"props":1243,"children":1245},{"className":1244},[417],[1246],{"type":90,"value":371},{"type":84,"tag":294,"props":1248,"children":1250},{"className":1249,"style":428},[427],[],{"type":84,"tag":294,"props":1252,"children":1254},{"className":1253,"style":428},[427],[],{"type":84,"tag":294,"props":1256,"children":1258},{"className":1257},[433],[1259],{"type":90,"value":376},{"type":84,"tag":294,"props":1261,"children":1263},{"className":1262,"style":428},[427],[],{"type":84,"tag":294,"props":1265,"children":1267},{"className":1266,"style":428},[427],[],{"type":84,"tag":294,"props":1269,"children":1271},{"className":1270},[406],[1272,1277,1286],{"type":84,"tag":294,"props":1273,"children":1276},{"className":1274,"style":1275},[411],"height:1em;vertical-align:-0.25em;",[],{"type":84,"tag":294,"props":1278,"children":1280},{"className":1279},[417,90],[1281],{"type":84,"tag":294,"props":1282,"children":1284},{"className":1283},[417],[1285],{"type":90,"value":381},{"type":84,"tag":294,"props":1287,"children":1289},{"className":1288},[548],[1290],{"type":90,"value":386},{"type":84,"tag":93,"props":1292,"children":1293},{},[1294],{"type":90,"value":1295},"In pseudocode:",{"type":84,"tag":1297,"props":1298,"children":1302},"pre",{"className":1299,"code":1301,"language":90},[1300],"language-text","function pfHmac(serverSeed, clientSeed, nonce) {\n  const message = clientSeed + ':' + nonce\n  const hex = hmacSha256(serverSeed, message)  \u002F\u002F 64-char hex string\n  return hex\n}\n",[1303],{"type":84,"tag":99,"props":1304,"children":1306},{"__ignoreMap":1305},"",[1307],{"type":90,"value":1301},{"type":84,"tag":93,"props":1309,"children":1310},{},[1311,1313,1318],{"type":90,"value":1312},"The ",{"type":84,"tag":99,"props":1314,"children":1316},{"className":1315},[],[1317],{"type":90,"value":376},{"type":90,"value":1319}," colon is the canonical separator on Stake, Primedice, Rainbet, and most PF casinos. A few (BC.Game, Roobet) use different delimiters — always check the casino's fairness docs for the exact format.",{"type":84,"tag":93,"props":1321,"children":1322},{},[1323,1325,1331],{"type":90,"value":1324},"The output is a 64-character hexadecimal string like ",{"type":84,"tag":99,"props":1326,"children":1328},{"className":1327},[],[1329],{"type":90,"value":1330},"8b2d4a1f9c6e7b3d5a8f2c9e4b1d7a6f3e8c5b2d9a4f7e1c8b3d6a2f9e5c4b7d",{"type":90,"value":1332},". That hex is the raw randomness — 256 bits of unpredictability, statistically indistinguishable from flipping 256 fair coins.",{"type":84,"tag":1334,"props":1335,"children":1336},"chart-provably-fair-process",{},[],{"type":84,"tag":597,"props":1338,"children":1340},{"id":1339},"step-by-step-from-hmac-output-to-dice-roll",[1341],{"type":90,"value":1342},"Step-by-Step: From HMAC Output to Dice Roll",{"type":84,"tag":93,"props":1344,"children":1345},{},[1346],{"type":90,"value":1347},"Let's do one round end-to-end.",{"type":84,"tag":93,"props":1349,"children":1350},{},[1351],{"type":84,"tag":126,"props":1352,"children":1353},{},[1354],{"type":90,"value":1355},"Given values:",{"type":84,"tag":604,"props":1357,"children":1358},{},[1359,1368,1377],{"type":84,"tag":608,"props":1360,"children":1361},{},[1362],{"type":84,"tag":99,"props":1363,"children":1365},{"className":1364},[],[1366],{"type":90,"value":1367},"server_seed = f4a9c2e1b7d8e3c5a1b9f6d2e8c4a7b3e9d1c6a2b5f8e4c7a3b6e1d9c2a5b8f4",{"type":84,"tag":608,"props":1369,"children":1370},{},[1371],{"type":84,"tag":99,"props":1372,"children":1374},{"className":1373},[],[1375],{"type":90,"value":1376},"client_seed = player-xyz-42",{"type":84,"tag":608,"props":1378,"children":1379},{},[1380],{"type":84,"tag":99,"props":1381,"children":1383},{"className":1382},[],[1384],{"type":90,"value":1385},"nonce = 7",{"type":84,"tag":93,"props":1387,"children":1388},{},[1389],{"type":84,"tag":126,"props":1390,"children":1391},{},[1392],{"type":90,"value":1393},"Step 1 — Compute HMAC:",{"type":84,"tag":1297,"props":1395,"children":1398},{"className":1396,"code":1397,"language":90},[1300],"HMAC-SHA256(server_seed, \"player-xyz-42:7\")\n= 8b2d4a1f9c6e7b3d5a8f2c9e4b1d7a6f3e8c5b2d9a4f7e1c8b3d6a2f9e5c4b7d\n",[1399],{"type":84,"tag":99,"props":1400,"children":1401},{"__ignoreMap":1305},[1402],{"type":90,"value":1397},{"type":84,"tag":93,"props":1404,"children":1405},{},[1406],{"type":84,"tag":126,"props":1407,"children":1408},{},[1409],{"type":90,"value":1410},"Step 2 — Slice first 5 hex characters:",{"type":84,"tag":93,"props":1412,"children":1413},{},[1414,1420,1422],{"type":84,"tag":99,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":90,"value":1419},"8b2d4",{"type":90,"value":1421}," → convert to decimal → ",{"type":84,"tag":99,"props":1423,"children":1425},{"className":1424},[],[1426],{"type":90,"value":1427},"569,300",{"type":84,"tag":93,"props":1429,"children":1430},{},[1431],{"type":84,"tag":126,"props":1432,"children":1433},{},[1434],{"type":90,"value":1435},"Step 3 — Map to 0-99.9999:",{"type":84,"tag":1297,"props":1437,"children":1440},{"className":1438,"code":1439,"language":90},[1300],"dice = (569_300 % 1_000_000) \u002F 10_000\n     = 569_300 \u002F 10_000\n     = 56.93\n",[1441],{"type":84,"tag":99,"props":1442,"children":1443},{"__ignoreMap":1305},[1444],{"type":90,"value":1439},{"type":84,"tag":93,"props":1446,"children":1447},{},[1448],{"type":84,"tag":126,"props":1449,"children":1450},{},[1451],{"type":90,"value":1452},"Step 4 — Apply bet logic:",{"type":84,"tag":93,"props":1454,"children":1455},{},[1456],{"type":90,"value":1457},"If you bet \"roll under 50\" → you lose (56.93 > 50). If you bet \"roll under 60\" → you win. The exact roll was determined the instant those three inputs combined, before any UI animation ran.",{"type":84,"tag":93,"props":1459,"children":1460},{},[1461],{"type":84,"tag":126,"props":1462,"children":1463},{},[1464],{"type":90,"value":1465},"Step 5 — Verify:",{"type":84,"tag":93,"props":1467,"children":1468},{},[1469,1471,1476,1478,1484],{"type":90,"value":1470},"Post-round, you receive the revealed ",{"type":84,"tag":99,"props":1472,"children":1474},{"className":1473},[],[1475],{"type":90,"value":356},{"type":90,"value":1477},". You hash it — SHA-256 matches the pre-committed hash? Good. You re-run steps 1-3 — reproduced ",{"type":84,"tag":99,"props":1479,"children":1481},{"className":1480},[],[1482],{"type":90,"value":1483},"56.93",{"type":90,"value":1485},"? Good. The round is cryptographically proven fair.",{"type":84,"tag":93,"props":1487,"children":1488},{},[1489,1491,1497],{"type":90,"value":1490},"For a full walkthrough with copy-paste values and screenshots, see ",{"type":84,"tag":722,"props":1492,"children":1494},{"href":1493},"\u002Fblog\u002Fhow-to-verify-provably-fair",[1495],{"type":90,"value":1496},"how to verify a provably fair round",{"type":90,"value":765},{"type":84,"tag":597,"props":1499,"children":1501},{"id":1500},"different-games-different-mappings",[1502],{"type":90,"value":1503},"Different Games, Different Mappings",{"type":84,"tag":93,"props":1505,"children":1506},{},[1507],{"type":90,"value":1508},"The HMAC call is always identical. What changes is step 3 — how the hex gets mapped to a specific game outcome.",{"type":84,"tag":144,"props":1510,"children":1511},{},[1512,1538],{"type":84,"tag":148,"props":1513,"children":1514},{},[1515],{"type":84,"tag":76,"props":1516,"children":1517},{},[1518,1523,1528,1533],{"type":84,"tag":155,"props":1519,"children":1520},{},[1521],{"type":90,"value":1522},"Game",{"type":84,"tag":155,"props":1524,"children":1525},{},[1526],{"type":90,"value":1527},"Hex slice",{"type":84,"tag":155,"props":1529,"children":1530},{},[1531],{"type":90,"value":1532},"Formula",{"type":84,"tag":155,"props":1534,"children":1535},{},[1536],{"type":90,"value":1537},"Output range",{"type":84,"tag":171,"props":1539,"children":1540},{},[1541,1571,1601,1633,1672,1704],{"type":84,"tag":76,"props":1542,"children":1543},{},[1544,1552,1557,1566],{"type":84,"tag":178,"props":1545,"children":1546},{},[1547],{"type":84,"tag":126,"props":1548,"children":1549},{},[1550],{"type":90,"value":1551},"Dice",{"type":84,"tag":178,"props":1553,"children":1554},{},[1555],{"type":90,"value":1556},"First 5 chars",{"type":84,"tag":178,"props":1558,"children":1559},{},[1560],{"type":84,"tag":99,"props":1561,"children":1563},{"className":1562},[],[1564],{"type":90,"value":1565},"(int % 1e6) \u002F 1e4",{"type":84,"tag":178,"props":1567,"children":1568},{},[1569],{"type":90,"value":1570},"0.0000-99.9999",{"type":84,"tag":76,"props":1572,"children":1573},{},[1574,1582,1587,1596],{"type":84,"tag":178,"props":1575,"children":1576},{},[1577],{"type":84,"tag":126,"props":1578,"children":1579},{},[1580],{"type":90,"value":1581},"Crash",{"type":84,"tag":178,"props":1583,"children":1584},{},[1585],{"type":90,"value":1586},"First 8 chars",{"type":84,"tag":178,"props":1588,"children":1589},{},[1590],{"type":84,"tag":99,"props":1591,"children":1593},{"className":1592},[],[1594],{"type":90,"value":1595},"floor((100 * 2^52 - h) \u002F (2^52 - h)) \u002F 100",{"type":84,"tag":178,"props":1597,"children":1598},{},[1599],{"type":90,"value":1600},"1.00x to very high",{"type":84,"tag":76,"props":1602,"children":1603},{},[1604,1612,1617,1628],{"type":84,"tag":178,"props":1605,"children":1606},{},[1607],{"type":84,"tag":126,"props":1608,"children":1609},{},[1610],{"type":90,"value":1611},"Coinflip",{"type":84,"tag":178,"props":1613,"children":1614},{},[1615],{"type":90,"value":1616},"First 2 chars",{"type":84,"tag":178,"props":1618,"children":1619},{},[1620,1626],{"type":84,"tag":99,"props":1621,"children":1623},{"className":1622},[],[1624],{"type":90,"value":1625},"int % 2",{"type":90,"value":1627}," (0 or 1)",{"type":84,"tag":178,"props":1629,"children":1630},{},[1631],{"type":90,"value":1632},"Heads\u002FTails",{"type":84,"tag":76,"props":1634,"children":1635},{},[1636,1644,1648,1667],{"type":84,"tag":178,"props":1637,"children":1638},{},[1639],{"type":84,"tag":126,"props":1640,"children":1641},{},[1642],{"type":90,"value":1643},"Roulette",{"type":84,"tag":178,"props":1645,"children":1646},{},[1647],{"type":90,"value":1616},{"type":84,"tag":178,"props":1649,"children":1650},{},[1651,1657,1659,1665],{"type":84,"tag":99,"props":1652,"children":1654},{"className":1653},[],[1655],{"type":90,"value":1656},"int % 37",{"type":90,"value":1658}," (Euro) or ",{"type":84,"tag":99,"props":1660,"children":1662},{"className":1661},[],[1663],{"type":90,"value":1664},"% 38",{"type":90,"value":1666}," (Am)",{"type":84,"tag":178,"props":1668,"children":1669},{},[1670],{"type":90,"value":1671},"0-36 or 0-37",{"type":84,"tag":76,"props":1673,"children":1674},{},[1675,1683,1688,1699],{"type":84,"tag":178,"props":1676,"children":1677},{},[1678],{"type":84,"tag":126,"props":1679,"children":1680},{},[1681],{"type":90,"value":1682},"Plinko",{"type":84,"tag":178,"props":1684,"children":1685},{},[1686],{"type":90,"value":1687},"First 4 chars × n drops",{"type":84,"tag":178,"props":1689,"children":1690},{},[1691,1697],{"type":84,"tag":99,"props":1692,"children":1694},{"className":1693},[],[1695],{"type":90,"value":1696},"int % rows",{"type":90,"value":1698}," per drop",{"type":84,"tag":178,"props":1700,"children":1701},{},[1702],{"type":90,"value":1703},"Path through pegs",{"type":84,"tag":76,"props":1705,"children":1706},{},[1707,1715,1720,1731],{"type":84,"tag":178,"props":1708,"children":1709},{},[1710],{"type":84,"tag":126,"props":1711,"children":1712},{},[1713],{"type":90,"value":1714},"Blackjack (HMAC-SHA512)",{"type":84,"tag":178,"props":1716,"children":1717},{},[1718],{"type":90,"value":1719},"4 chars per card",{"type":84,"tag":178,"props":1721,"children":1722},{},[1723,1729],{"type":84,"tag":99,"props":1724,"children":1726},{"className":1725},[],[1727],{"type":90,"value":1728},"int % 52",{"type":90,"value":1730}," with replacement logic",{"type":84,"tag":178,"props":1732,"children":1733},{},[1734],{"type":90,"value":1735},"Card deck position",{"type":84,"tag":93,"props":1737,"children":1738},{},[1739,1741,1746],{"type":90,"value":1740},"Each mapping is designed to be uniform across its output range — modular arithmetic on a uniformly random hex value preserves uniformity. This is why PF games can claim honest RTP without the casino manipulating individual rounds. It's the ",{"type":84,"tag":108,"props":1742,"children":1743},{},[1744],{"type":90,"value":1745},"mapping formula",{"type":90,"value":1747}," that gets tuned to hit the casino's target house edge, not the random number itself.",{"type":84,"tag":85,"props":1749,"children":1751},{"id":1750},"from-hex-string-to-game-outcome-with-math",[1752],{"type":90,"value":1753},"From Hex String to Game Outcome (With Math)",{"type":84,"tag":93,"props":1755,"children":1756},{},[1757],{"type":90,"value":1758},"The dice mapping is worth dissecting because it's the clearest case — and because it shows why provably fair dice distributions are genuinely uniform when implemented correctly.",{"type":84,"tag":597,"props":1760,"children":1762},{"id":1761},"dice-mapping-0-999999",[1763],{"type":90,"value":1764},"Dice Mapping (0-99.9999)",{"type":84,"tag":93,"props":1766,"children":1767},{},[1768],{"type":90,"value":1769},"Stake's dice uses the first 5 hex characters, which gives 20 bits = 1,048,576 possible values. The mapping is:",{"type":84,"tag":93,"props":1771,"children":1772},{},[1773],{"type":84,"tag":294,"props":1774,"children":1776},{"className":1775},[297],[1777,1898],{"type":84,"tag":294,"props":1778,"children":1780},{"className":1779},[302],[1781],{"type":84,"tag":305,"props":1782,"children":1783},{"xmlns":307},[1784],{"type":84,"tag":310,"props":1785,"children":1786},{},[1787,1893],{"type":84,"tag":314,"props":1788,"children":1789},{},[1790,1795,1799],{"type":84,"tag":318,"props":1791,"children":1792},{},[1793],{"type":90,"value":1794},"dice",{"type":84,"tag":324,"props":1796,"children":1797},{},[1798],{"type":90,"value":328},{"type":84,"tag":1800,"props":1801,"children":1802},"mfrac",{},[1803,1881],{"type":84,"tag":314,"props":1804,"children":1805},{},[1806,1810,1815,1819,1846,1850,1854,1859,1863,1877],{"type":84,"tag":324,"props":1807,"children":1808},{"stretchy":337},[1809],{"type":90,"value":342},{"type":84,"tag":318,"props":1811,"children":1812},{},[1813],{"type":90,"value":1814},"int",{"type":84,"tag":324,"props":1816,"children":1817},{"stretchy":337},[1818],{"type":90,"value":342},{"type":84,"tag":1820,"props":1821,"children":1822},"msub",{},[1823,1828],{"type":84,"tag":318,"props":1824,"children":1825},{},[1826],{"type":90,"value":1827},"hex",{"type":84,"tag":314,"props":1829,"children":1830},{},[1831,1837,1841],{"type":84,"tag":1832,"props":1833,"children":1834},"mn",{},[1835],{"type":90,"value":1836},"0",{"type":84,"tag":324,"props":1838,"children":1839},{},[1840],{"type":90,"value":376},{"type":84,"tag":1832,"props":1842,"children":1843},{},[1844],{"type":90,"value":1845},"5",{"type":84,"tag":324,"props":1847,"children":1848},{"stretchy":337},[1849],{"type":90,"value":386},{"type":84,"tag":318,"props":1851,"children":1852},{},[1853],{"type":90,"value":366},{"type":84,"tag":318,"props":1855,"children":1856},{},[1857],{"type":90,"value":1858},"mod",{"type":84,"tag":318,"props":1860,"children":1861},{},[1862],{"type":90,"value":366},{"type":84,"tag":1864,"props":1865,"children":1866},"msup",{},[1867,1872],{"type":84,"tag":1832,"props":1868,"children":1869},{},[1870],{"type":90,"value":1871},"10",{"type":84,"tag":1832,"props":1873,"children":1874},{},[1875],{"type":90,"value":1876},"6",{"type":84,"tag":324,"props":1878,"children":1879},{"stretchy":337},[1880],{"type":90,"value":386},{"type":84,"tag":1864,"props":1882,"children":1883},{},[1884,1888],{"type":84,"tag":1832,"props":1885,"children":1886},{},[1887],{"type":90,"value":1871},{"type":84,"tag":1832,"props":1889,"children":1890},{},[1891],{"type":90,"value":1892},"4",{"type":84,"tag":392,"props":1894,"children":1895},{"encoding":394},[1896],{"type":90,"value":1897},"\\text{dice} = \\frac{(\\text{int}(\\text{hex}_{0:5}) \\; \\text{mod} \\; 10^6)}{10^4}",{"type":84,"tag":294,"props":1899,"children":1901},{"className":1900,"ariaHidden":338},[401],[1902,1933],{"type":84,"tag":294,"props":1903,"children":1905},{"className":1904},[406],[1906,1911,1920,1924,1929],{"type":84,"tag":294,"props":1907,"children":1910},{"className":1908,"style":1909},[411],"height:0.6944em;",[],{"type":84,"tag":294,"props":1912,"children":1914},{"className":1913},[417,90],[1915],{"type":84,"tag":294,"props":1916,"children":1918},{"className":1917},[417],[1919],{"type":90,"value":1794},{"type":84,"tag":294,"props":1921,"children":1923},{"className":1922,"style":428},[427],[],{"type":84,"tag":294,"props":1925,"children":1927},{"className":1926},[433],[1928],{"type":90,"value":328},{"type":84,"tag":294,"props":1930,"children":1932},{"className":1931,"style":428},[427],[],{"type":84,"tag":294,"props":1934,"children":1936},{"className":1935},[406],[1937,1942],{"type":84,"tag":294,"props":1938,"children":1941},{"className":1939,"style":1940},[411],"height:1.4539em;vertical-align:-0.345em;",[],{"type":84,"tag":294,"props":1943,"children":1945},{"className":1944},[417],[1946,1951,2268],{"type":84,"tag":294,"props":1947,"children":1950},{"className":1948},[479,1949],"nulldelimiter",[],{"type":84,"tag":294,"props":1952,"children":1954},{"className":1953},[1800],[1955],{"type":84,"tag":294,"props":1956,"children":1960},{"className":1957},[1958,1959],"vlist-t","vlist-t2",[1961,2256],{"type":84,"tag":294,"props":1962,"children":1965},{"className":1963},[1964],"vlist-r",[1966,2251],{"type":84,"tag":294,"props":1967,"children":1971},{"className":1968,"style":1970},[1969],"vlist","height:1.1089em;",[1972,2046,2060],{"type":84,"tag":294,"props":1973,"children":1975},{"style":1974},"top:-2.655em;",[1976,1982],{"type":84,"tag":294,"props":1977,"children":1981},{"className":1978,"style":1980},[1979],"pstrut","height:3em;",[],{"type":84,"tag":294,"props":1983,"children":1989},{"className":1984},[1985,1986,1987,1988],"sizing","reset-size6","size3","mtight",[1990],{"type":84,"tag":294,"props":1991,"children":1993},{"className":1992},[417,1988],[1994,2000],{"type":84,"tag":294,"props":1995,"children":1997},{"className":1996},[417,1988],[1998],{"type":90,"value":1999},"1",{"type":84,"tag":294,"props":2001,"children":2003},{"className":2002},[417,1988],[2004,2009],{"type":84,"tag":294,"props":2005,"children":2007},{"className":2006},[417,1988],[2008],{"type":90,"value":1836},{"type":84,"tag":294,"props":2010,"children":2013},{"className":2011},[2012],"msupsub",[2014],{"type":84,"tag":294,"props":2015,"children":2017},{"className":2016},[1958],[2018],{"type":84,"tag":294,"props":2019,"children":2021},{"className":2020},[1964],[2022],{"type":84,"tag":294,"props":2023,"children":2026},{"className":2024,"style":2025},[1969],"height:0.7463em;",[2027],{"type":84,"tag":294,"props":2028,"children":2030},{"style":2029},"top:-2.786em;margin-right:0.0714em;",[2031,2036],{"type":84,"tag":294,"props":2032,"children":2035},{"className":2033,"style":2034},[1979],"height:2.5em;",[],{"type":84,"tag":294,"props":2037,"children":2040},{"className":2038},[1985,2039,464,1988],"reset-size3",[2041],{"type":84,"tag":294,"props":2042,"children":2044},{"className":2043},[417,1988],[2045],{"type":90,"value":1892},{"type":84,"tag":294,"props":2047,"children":2049},{"style":2048},"top:-3.23em;",[2050,2054],{"type":84,"tag":294,"props":2051,"children":2053},{"className":2052,"style":1980},[1979],[],{"type":84,"tag":294,"props":2055,"children":2059},{"className":2056,"style":2058},[2057],"frac-line","border-bottom-width:0.04em;",[],{"type":84,"tag":294,"props":2061,"children":2063},{"style":2062},"top:-3.485em;",[2064,2068],{"type":84,"tag":294,"props":2065,"children":2067},{"className":2066,"style":1980},[1979],[],{"type":84,"tag":294,"props":2069,"children":2071},{"className":2070},[1985,1986,1987,1988],[2072],{"type":84,"tag":294,"props":2073,"children":2075},{"className":2074},[417,1988],[2076,2081,2090,2095,2175,2180,2185,2194,2198,2203,2246],{"type":84,"tag":294,"props":2077,"children":2079},{"className":2078},[479,1988],[2080],{"type":90,"value":342},{"type":84,"tag":294,"props":2082,"children":2084},{"className":2083},[417,90,1988],[2085],{"type":84,"tag":294,"props":2086,"children":2088},{"className":2087},[417,1988],[2089],{"type":90,"value":1814},{"type":84,"tag":294,"props":2091,"children":2093},{"className":2092},[479,1988],[2094],{"type":90,"value":342},{"type":84,"tag":294,"props":2096,"children":2098},{"className":2097},[417,1988],[2099,2108],{"type":84,"tag":294,"props":2100,"children":2102},{"className":2101},[417,90,1988],[2103],{"type":84,"tag":294,"props":2104,"children":2106},{"className":2105},[417,1988],[2107],{"type":90,"value":1827},{"type":84,"tag":294,"props":2109,"children":2111},{"className":2110},[2012],[2112],{"type":84,"tag":294,"props":2113,"children":2115},{"className":2114},[1958,1959],[2116,2163],{"type":84,"tag":294,"props":2117,"children":2119},{"className":2118},[1964],[2120,2156],{"type":84,"tag":294,"props":2121,"children":2124},{"className":2122,"style":2123},[1969],"height:0.3173em;",[2125],{"type":84,"tag":294,"props":2126,"children":2128},{"style":2127},"top:-2.357em;margin-right:0.0714em;",[2129,2133],{"type":84,"tag":294,"props":2130,"children":2132},{"className":2131,"style":2034},[1979],[],{"type":84,"tag":294,"props":2134,"children":2136},{"className":2135},[1985,2039,464,1988],[2137],{"type":84,"tag":294,"props":2138,"children":2140},{"className":2139},[417,1988],[2141,2146,2151],{"type":84,"tag":294,"props":2142,"children":2144},{"className":2143},[417,1988],[2145],{"type":90,"value":1836},{"type":84,"tag":294,"props":2147,"children":2149},{"className":2148},[433,1988],[2150],{"type":90,"value":376},{"type":84,"tag":294,"props":2152,"children":2154},{"className":2153},[417,1988],[2155],{"type":90,"value":1845},{"type":84,"tag":294,"props":2157,"children":2160},{"className":2158},[2159],"vlist-s",[2161],{"type":90,"value":2162},"​",{"type":84,"tag":294,"props":2164,"children":2166},{"className":2165},[1964],[2167],{"type":84,"tag":294,"props":2168,"children":2171},{"className":2169,"style":2170},[1969],"height:0.143em;",[2172],{"type":84,"tag":294,"props":2173,"children":2174},{},[],{"type":84,"tag":294,"props":2176,"children":2178},{"className":2177},[548,1988],[2179],{"type":90,"value":386},{"type":84,"tag":294,"props":2181,"children":2184},{"className":2182,"style":2183},[427,1988],"margin-right:0.3253em;",[],{"type":84,"tag":294,"props":2186,"children":2188},{"className":2187},[417,90,1988],[2189],{"type":84,"tag":294,"props":2190,"children":2192},{"className":2191},[417,1988],[2193],{"type":90,"value":1858},{"type":84,"tag":294,"props":2195,"children":2197},{"className":2196,"style":2183},[427,1988],[],{"type":84,"tag":294,"props":2199,"children":2201},{"className":2200},[417,1988],[2202],{"type":90,"value":1999},{"type":84,"tag":294,"props":2204,"children":2206},{"className":2205},[417,1988],[2207,2212],{"type":84,"tag":294,"props":2208,"children":2210},{"className":2209},[417,1988],[2211],{"type":90,"value":1836},{"type":84,"tag":294,"props":2213,"children":2215},{"className":2214},[2012],[2216],{"type":84,"tag":294,"props":2217,"children":2219},{"className":2218},[1958],[2220],{"type":84,"tag":294,"props":2221,"children":2223},{"className":2222},[1964],[2224],{"type":84,"tag":294,"props":2225,"children":2228},{"className":2226,"style":2227},[1969],"height:0.8913em;",[2229],{"type":84,"tag":294,"props":2230,"children":2232},{"style":2231},"top:-2.931em;margin-right:0.0714em;",[2233,2237],{"type":84,"tag":294,"props":2234,"children":2236},{"className":2235,"style":2034},[1979],[],{"type":84,"tag":294,"props":2238,"children":2240},{"className":2239},[1985,2039,464,1988],[2241],{"type":84,"tag":294,"props":2242,"children":2244},{"className":2243},[417,1988],[2245],{"type":90,"value":1876},{"type":84,"tag":294,"props":2247,"children":2249},{"className":2248},[548,1988],[2250],{"type":90,"value":386},{"type":84,"tag":294,"props":2252,"children":2254},{"className":2253},[2159],[2255],{"type":90,"value":2162},{"type":84,"tag":294,"props":2257,"children":2259},{"className":2258},[1964],[2260],{"type":84,"tag":294,"props":2261,"children":2264},{"className":2262,"style":2263},[1969],"height:0.345em;",[2265],{"type":84,"tag":294,"props":2266,"children":2267},{},[],{"type":84,"tag":294,"props":2269,"children":2271},{"className":2270},[548,1949],[],{"type":84,"tag":93,"props":2273,"children":2274},{},[2275,2277,2282],{"type":90,"value":2276},"Why modulo 1,000,000 when the slice can reach 1,048,575? Because without the modulo, values 1,000,000-1,048,575 would map to 100.0000-104.8575, outside the dice range. Modulo folds those back — but introduces a tiny bias (values 0-48,575 are more likely than 48,576-99,999 by a factor of 2\u002F1). To eliminate the bias, real implementations ",{"type":84,"tag":108,"props":2278,"children":2279},{},[2280],{"type":90,"value":2281},"reject",{"type":90,"value":2283}," slices above 1,000,000 and advance to the next hex chunk (chars 5-10, then 10-15, etc.).",{"type":84,"tag":93,"props":2285,"children":2286},{},[2287],{"type":90,"value":2288},"Done correctly, this produces a perfectly uniform distribution across 0.0000-99.9999. A 10,000-roll test shows essentially flat coverage — the histogram below reproduces what you'd see with any legitimate PF dice implementation.",{"type":84,"tag":2290,"props":2291,"children":2292},"chart-rng-distribution",{},[],{"type":84,"tag":597,"props":2294,"children":2296},{"id":2295},"crash-mapping-multiplier",[2297],{"type":90,"value":2298},"Crash Mapping (Multiplier)",{"type":84,"tag":93,"props":2300,"children":2301},{},[2302],{"type":90,"value":2303},"Crash is more interesting because the output isn't uniform — it's deliberately skewed to create dramatic gameplay while preserving a target house edge.",{"type":84,"tag":93,"props":2305,"children":2306},{},[2307],{"type":84,"tag":294,"props":2308,"children":2310},{"className":2309},[297],[2311,2423],{"type":84,"tag":294,"props":2312,"children":2314},{"className":2313},[302],[2315],{"type":84,"tag":305,"props":2316,"children":2317},{"xmlns":307},[2318],{"type":84,"tag":310,"props":2319,"children":2320},{},[2321,2418],{"type":84,"tag":314,"props":2322,"children":2323},{},[2324,2329,2333],{"type":84,"tag":318,"props":2325,"children":2326},{},[2327],{"type":90,"value":2328},"crash",{"type":84,"tag":324,"props":2330,"children":2331},{},[2332],{"type":90,"value":328},{"type":84,"tag":1800,"props":2334,"children":2335},{},[2336,2414],{"type":84,"tag":314,"props":2337,"children":2338},{},[2339,2344,2409],{"type":84,"tag":324,"props":2340,"children":2341},{"fence":338},[2342],{"type":90,"value":2343},"⌊",{"type":84,"tag":2345,"props":2346,"children":2347},"mstyle",{"scriptlevel":1836,"displaystyle":338},[2348],{"type":84,"tag":1800,"props":2349,"children":2350},{},[2351,2387],{"type":84,"tag":314,"props":2352,"children":2353},{},[2354,2359,2364,2377,2382],{"type":84,"tag":1832,"props":2355,"children":2356},{},[2357],{"type":90,"value":2358},"100",{"type":84,"tag":324,"props":2360,"children":2361},{},[2362],{"type":90,"value":2363},"⋅",{"type":84,"tag":1864,"props":2365,"children":2366},{},[2367,2372],{"type":84,"tag":1832,"props":2368,"children":2369},{},[2370],{"type":90,"value":2371},"2",{"type":84,"tag":1832,"props":2373,"children":2374},{},[2375],{"type":90,"value":2376},"52",{"type":84,"tag":324,"props":2378,"children":2379},{},[2380],{"type":90,"value":2381},"−",{"type":84,"tag":330,"props":2383,"children":2384},{},[2385],{"type":90,"value":2386},"h",{"type":84,"tag":314,"props":2388,"children":2389},{},[2390,2401,2405],{"type":84,"tag":1864,"props":2391,"children":2392},{},[2393,2397],{"type":84,"tag":1832,"props":2394,"children":2395},{},[2396],{"type":90,"value":2371},{"type":84,"tag":1832,"props":2398,"children":2399},{},[2400],{"type":90,"value":2376},{"type":84,"tag":324,"props":2402,"children":2403},{},[2404],{"type":90,"value":2381},{"type":84,"tag":330,"props":2406,"children":2407},{},[2408],{"type":90,"value":2386},{"type":84,"tag":324,"props":2410,"children":2411},{"fence":338},[2412],{"type":90,"value":2413},"⌋",{"type":84,"tag":1832,"props":2415,"children":2416},{},[2417],{"type":90,"value":2358},{"type":84,"tag":392,"props":2419,"children":2420},{"encoding":394},[2421],{"type":90,"value":2422},"\\text{crash} = \\frac{\\left\\lfloor \\dfrac{100 \\cdot 2^{52} - h}{2^{52} - h} \\right\\rfloor}{100}",{"type":84,"tag":294,"props":2424,"children":2426},{"className":2425,"ariaHidden":338},[401],[2427,2457],{"type":84,"tag":294,"props":2428,"children":2430},{"className":2429},[406],[2431,2435,2444,2448,2453],{"type":84,"tag":294,"props":2432,"children":2434},{"className":2433,"style":1909},[411],[],{"type":84,"tag":294,"props":2436,"children":2438},{"className":2437},[417,90],[2439],{"type":84,"tag":294,"props":2440,"children":2442},{"className":2441},[417],[2443],{"type":90,"value":2328},{"type":84,"tag":294,"props":2445,"children":2447},{"className":2446,"style":428},[427],[],{"type":84,"tag":294,"props":2449,"children":2451},{"className":2450},[433],[2452],{"type":90,"value":328},{"type":84,"tag":294,"props":2454,"children":2456},{"className":2455,"style":428},[427],[],{"type":84,"tag":294,"props":2458,"children":2460},{"className":2459},[406],[2461,2466],{"type":84,"tag":294,"props":2462,"children":2465},{"className":2463,"style":2464},[411],"height:3.1486em;vertical-align:-0.345em;",[],{"type":84,"tag":294,"props":2467,"children":2469},{"className":2468},[417],[2470,2474,2823],{"type":84,"tag":294,"props":2471,"children":2473},{"className":2472},[479,1949],[],{"type":84,"tag":294,"props":2475,"children":2477},{"className":2476},[1800],[2478],{"type":84,"tag":294,"props":2479,"children":2481},{"className":2480},[1958,1959],[2482,2812],{"type":84,"tag":294,"props":2483,"children":2485},{"className":2484},[1964],[2486,2807],{"type":84,"tag":294,"props":2487,"children":2490},{"className":2488,"style":2489},[1969],"height:2.8036em;",[2491,2513,2525],{"type":84,"tag":294,"props":2492,"children":2494},{"style":2493},"top:-3.1461em;",[2495,2500],{"type":84,"tag":294,"props":2496,"children":2499},{"className":2497,"style":2498},[1979],"height:3.4911em;",[],{"type":84,"tag":294,"props":2501,"children":2503},{"className":2502},[1985,1986,1987,1988],[2504],{"type":84,"tag":294,"props":2505,"children":2507},{"className":2506},[417,1988],[2508],{"type":84,"tag":294,"props":2509,"children":2511},{"className":2510},[417,1988],[2512],{"type":90,"value":2358},{"type":84,"tag":294,"props":2514,"children":2516},{"style":2515},"top:-3.7211em;",[2517,2521],{"type":84,"tag":294,"props":2518,"children":2520},{"className":2519,"style":2498},[1979],[],{"type":84,"tag":294,"props":2522,"children":2524},{"className":2523,"style":2058},[2057],[],{"type":84,"tag":294,"props":2526,"children":2528},{"style":2527},"top:-4.8036em;",[2529,2533],{"type":84,"tag":294,"props":2530,"children":2532},{"className":2531,"style":2498},[1979],[],{"type":84,"tag":294,"props":2534,"children":2536},{"className":2535},[1985,1986,1987,1988],[2537],{"type":84,"tag":294,"props":2538,"children":2540},{"className":2539},[417,1988],[2541],{"type":84,"tag":294,"props":2542,"children":2545},{"className":2543},[2544,1988],"minner",[2546,2562,2794],{"type":84,"tag":294,"props":2547,"children":2552},{"className":2548,"style":2551},[479,1985,2039,2549,1988,2550],"size6","delimcenter","top:0.075em;",[2553],{"type":84,"tag":294,"props":2554,"children":2556},{"className":2555},[463,1987,1988],[2557],{"type":84,"tag":294,"props":2558,"children":2560},{"className":2559},[1988],[2561],{"type":90,"value":2343},{"type":84,"tag":294,"props":2563,"children":2565},{"className":2564},[417,1985,2039,2549],[2566,2570,2790],{"type":84,"tag":294,"props":2567,"children":2569},{"className":2568},[479,1949],[],{"type":84,"tag":294,"props":2571,"children":2573},{"className":2572},[1800],[2574],{"type":84,"tag":294,"props":2575,"children":2577},{"className":2576},[1958,1959],[2578,2778],{"type":84,"tag":294,"props":2579,"children":2581},{"className":2580},[1964],[2582,2773],{"type":84,"tag":294,"props":2583,"children":2586},{"className":2584,"style":2585},[1969],"height:1.4911em;",[2587,2667,2678],{"type":84,"tag":294,"props":2588,"children":2590},{"style":2589},"top:-2.314em;",[2591,2595],{"type":84,"tag":294,"props":2592,"children":2594},{"className":2593,"style":1980},[1979],[],{"type":84,"tag":294,"props":2596,"children":2598},{"className":2597},[417],[2599,2647,2652,2658,2662],{"type":84,"tag":294,"props":2600,"children":2602},{"className":2601},[417],[2603,2608],{"type":84,"tag":294,"props":2604,"children":2606},{"className":2605},[417],[2607],{"type":90,"value":2371},{"type":84,"tag":294,"props":2609,"children":2611},{"className":2610},[2012],[2612],{"type":84,"tag":294,"props":2613,"children":2615},{"className":2614},[1958],[2616],{"type":84,"tag":294,"props":2617,"children":2619},{"className":2618},[1964],[2620],{"type":84,"tag":294,"props":2621,"children":2624},{"className":2622,"style":2623},[1969],"height:0.7401em;",[2625],{"type":84,"tag":294,"props":2626,"children":2628},{"style":2627},"top:-2.989em;margin-right:0.05em;",[2629,2634],{"type":84,"tag":294,"props":2630,"children":2633},{"className":2631,"style":2632},[1979],"height:2.7em;",[],{"type":84,"tag":294,"props":2635,"children":2637},{"className":2636},[1985,1986,1987,1988],[2638],{"type":84,"tag":294,"props":2639,"children":2641},{"className":2640},[417,1988],[2642],{"type":84,"tag":294,"props":2643,"children":2645},{"className":2644},[417,1988],[2646],{"type":90,"value":2376},{"type":84,"tag":294,"props":2648,"children":2651},{"className":2649,"style":2650},[427],"margin-right:0.2222em;",[],{"type":84,"tag":294,"props":2653,"children":2656},{"className":2654},[2655],"mbin",[2657],{"type":90,"value":2381},{"type":84,"tag":294,"props":2659,"children":2661},{"className":2660,"style":2650},[427],[],{"type":84,"tag":294,"props":2663,"children":2665},{"className":2664},[417,452],[2666],{"type":90,"value":2386},{"type":84,"tag":294,"props":2668,"children":2669},{"style":2048},[2670,2674],{"type":84,"tag":294,"props":2671,"children":2673},{"className":2672,"style":1980},[1979],[],{"type":84,"tag":294,"props":2675,"children":2677},{"className":2676,"style":2058},[2057],[],{"type":84,"tag":294,"props":2679,"children":2681},{"style":2680},"top:-3.677em;",[2682,2686],{"type":84,"tag":294,"props":2683,"children":2685},{"className":2684,"style":1980},[1979],[],{"type":84,"tag":294,"props":2687,"children":2689},{"className":2688},[417],[2690,2695,2699,2704,2708,2755,2759,2764,2768],{"type":84,"tag":294,"props":2691,"children":2693},{"className":2692},[417],[2694],{"type":90,"value":2358},{"type":84,"tag":294,"props":2696,"children":2698},{"className":2697,"style":2650},[427],[],{"type":84,"tag":294,"props":2700,"children":2702},{"className":2701},[2655],[2703],{"type":90,"value":2363},{"type":84,"tag":294,"props":2705,"children":2707},{"className":2706,"style":2650},[427],[],{"type":84,"tag":294,"props":2709,"children":2711},{"className":2710},[417],[2712,2717],{"type":84,"tag":294,"props":2713,"children":2715},{"className":2714},[417],[2716],{"type":90,"value":2371},{"type":84,"tag":294,"props":2718,"children":2720},{"className":2719},[2012],[2721],{"type":84,"tag":294,"props":2722,"children":2724},{"className":2723},[1958],[2725],{"type":84,"tag":294,"props":2726,"children":2728},{"className":2727},[1964],[2729],{"type":84,"tag":294,"props":2730,"children":2733},{"className":2731,"style":2732},[1969],"height:0.8141em;",[2734],{"type":84,"tag":294,"props":2735,"children":2737},{"style":2736},"top:-3.063em;margin-right:0.05em;",[2738,2742],{"type":84,"tag":294,"props":2739,"children":2741},{"className":2740,"style":2632},[1979],[],{"type":84,"tag":294,"props":2743,"children":2745},{"className":2744},[1985,1986,1987,1988],[2746],{"type":84,"tag":294,"props":2747,"children":2749},{"className":2748},[417,1988],[2750],{"type":84,"tag":294,"props":2751,"children":2753},{"className":2752},[417,1988],[2754],{"type":90,"value":2376},{"type":84,"tag":294,"props":2756,"children":2758},{"className":2757,"style":2650},[427],[],{"type":84,"tag":294,"props":2760,"children":2762},{"className":2761},[2655],[2763],{"type":90,"value":2381},{"type":84,"tag":294,"props":2765,"children":2767},{"className":2766,"style":2650},[427],[],{"type":84,"tag":294,"props":2769,"children":2771},{"className":2770},[417,452],[2772],{"type":90,"value":2386},{"type":84,"tag":294,"props":2774,"children":2776},{"className":2775},[2159],[2777],{"type":90,"value":2162},{"type":84,"tag":294,"props":2779,"children":2781},{"className":2780},[1964],[2782],{"type":84,"tag":294,"props":2783,"children":2786},{"className":2784,"style":2785},[1969],"height:0.7693em;",[2787],{"type":84,"tag":294,"props":2788,"children":2789},{},[],{"type":84,"tag":294,"props":2791,"children":2793},{"className":2792},[548,1949],[],{"type":84,"tag":294,"props":2795,"children":2797},{"className":2796,"style":2551},[548,1985,2039,2549,1988,2550],[2798],{"type":84,"tag":294,"props":2799,"children":2801},{"className":2800},[463,1987,1988],[2802],{"type":84,"tag":294,"props":2803,"children":2805},{"className":2804},[1988],[2806],{"type":90,"value":2413},{"type":84,"tag":294,"props":2808,"children":2810},{"className":2809},[2159],[2811],{"type":90,"value":2162},{"type":84,"tag":294,"props":2813,"children":2815},{"className":2814},[1964],[2816],{"type":84,"tag":294,"props":2817,"children":2819},{"className":2818,"style":2263},[1969],[2820],{"type":84,"tag":294,"props":2821,"children":2822},{},[],{"type":84,"tag":294,"props":2824,"children":2826},{"className":2825},[548,1949],[],{"type":84,"tag":93,"props":2828,"children":2829},{},[2830,2831,2837,2839,2845],{"type":90,"value":564},{"type":84,"tag":99,"props":2832,"children":2834},{"className":2833},[],[2835],{"type":90,"value":2836},"h = int(hex[0:8])",{"type":90,"value":2838}," (a 32-bit integer from the first 8 hex chars). With one modification: if ",{"type":84,"tag":99,"props":2840,"children":2842},{"className":2841},[],[2843],{"type":90,"value":2844},"h mod 33 == 0",{"type":90,"value":2846},", the multiplier is 1.00x (instant bust), which creates Stake's ~1% house edge. Other casinos use different divisors — 25 (Rainbet ~4% edge), 50 (low-edge variants), 100 (very low-edge).",{"type":84,"tag":93,"props":2848,"children":2849},{},[2850],{"type":90,"value":2851},"Run this formula a million times and you get a distribution where ~50% of rounds bust under 2x, ~10% pass 10x, and maybe 1% reach 100x. The expected value works out to 0.99 per 1 bet — the missing 1% is the house edge baked into the formula's constants, not into any per-round manipulation.",{"type":84,"tag":597,"props":2853,"children":2855},{"id":2854},"card-mapping-deck-shuffles",[2856],{"type":90,"value":2857},"Card Mapping (Deck Shuffles)",{"type":84,"tag":93,"props":2859,"children":2860},{},[2861],{"type":90,"value":2862},"PF blackjack, poker, and baccarat shuffle virtual decks using HMAC-SHA512 (longer output = more cards per hash call). The Fisher-Yates shuffle is the standard:",{"type":84,"tag":1297,"props":2864,"children":2867},{"className":2865,"code":2866,"language":90},[1300],"for i = 51 down to 1:\n  j = hmac_int(i) mod (i + 1)\n  swap(deck[i], deck[j])\n",[2868],{"type":84,"tag":99,"props":2869,"children":2870},{"__ignoreMap":1305},[2871],{"type":90,"value":2866},{"type":84,"tag":93,"props":2873,"children":2874},{},[2875,2877,2883,2885,2891],{"type":90,"value":2876},"Each ",{"type":84,"tag":99,"props":2878,"children":2880},{"className":2879},[],[2881],{"type":90,"value":2882},"hmac_int(i)",{"type":90,"value":2884}," call consumes 4 hex chars of the 128-char SHA-512 output. One round's cards are fully determined by one HMAC call, which is why you often see PF blackjack games show 13+ decimal-converted integers in the verification panel — one per card swap. For the specific implementation on Stake and BC.Game, see the ",{"type":84,"tag":722,"props":2886,"children":2888},{"href":2887},"\u002Fblog\u002Fprovably-fair-blackjack",[2889],{"type":90,"value":2890},"provably fair blackjack guide",{"type":90,"value":765},{"type":84,"tag":85,"props":2893,"children":2895},{"id":2894},"traditional-rng-vs-provably-fair-rng",[2896],{"type":90,"value":2897},"Traditional RNG vs Provably Fair RNG",{"type":84,"tag":93,"props":2899,"children":2900},{},[2901],{"type":90,"value":2902},"At the RNG level specifically (not the broader fairness stack), PF is a strict superset of certified CSPRNG.",{"type":84,"tag":597,"props":2904,"children":2906},{"id":2905},"where-traditional-rngs-fall-short",[2907],{"type":90,"value":2908},"Where Traditional RNGs Fall Short",{"type":84,"tag":93,"props":2910,"children":2911},{},[2912,2914,2919],{"type":90,"value":2913},"Certified RNGs from eCOGRA, iTech Labs, and GLI are all cryptographically secure — the math is as strong as PF's. The problem isn't the primitive, it's the ",{"type":84,"tag":126,"props":2915,"children":2916},{},[2917],{"type":90,"value":2918},"runtime trust model",{"type":90,"value":376},{"type":84,"tag":604,"props":2921,"children":2922},{},[2923,2928,2933,2938],{"type":84,"tag":608,"props":2924,"children":2925},{},[2926],{"type":90,"value":2927},"The certified RNG lives on the casino's server, audited once",{"type":84,"tag":608,"props":2929,"children":2930},{},[2931],{"type":90,"value":2932},"You never see its output directly, only the game's end state",{"type":84,"tag":608,"props":2934,"children":2935},{},[2936],{"type":90,"value":2937},"Nothing forces the casino to keep running the certified code in production",{"type":84,"tag":608,"props":2939,"children":2940},{},[2941],{"type":90,"value":2942},"A per-round dispute can't be resolved in real time",{"type":84,"tag":93,"props":2944,"children":2945},{},[2946],{"type":90,"value":2947},"If Pragmatic Play's certified slot engine quietly runs a different RNG in Roobet's production than the one eCOGRA tested, no amount of certificate checking catches it. The gap closes only with open verification per round.",{"type":84,"tag":597,"props":2949,"children":2951},{"id":2950},"what-pf-adds-to-the-primitive",[2952],{"type":90,"value":2953},"What PF Adds to the Primitive",{"type":84,"tag":93,"props":2955,"children":2956},{},[2957],{"type":90,"value":2958},"Provably fair takes the same cryptographic foundation and exposes it. Specifically:",{"type":84,"tag":604,"props":2960,"children":2961},{},[2962,2974,2979,2984],{"type":84,"tag":608,"props":2963,"children":2964},{},[2965,2967,2972],{"type":90,"value":2966},"The server seed hash is published ",{"type":84,"tag":108,"props":2968,"children":2969},{},[2970],{"type":90,"value":2971},"before",{"type":90,"value":2973}," your bet (commitment)",{"type":84,"tag":608,"props":2975,"children":2976},{},[2977],{"type":90,"value":2978},"Your client seed contributes to the HMAC input (co-signing)",{"type":84,"tag":608,"props":2980,"children":2981},{},[2982],{"type":90,"value":2983},"The raw server seed is revealed after the round (reveal)",{"type":84,"tag":608,"props":2985,"children":2986},{},[2987],{"type":90,"value":2988},"The computation is deterministic and reproducible in any browser (verification)",{"type":84,"tag":93,"props":2990,"children":2991},{},[2992,2994,2998],{"type":90,"value":2993},"That's the whole difference. Same HMAC, same CSPRNG math — with four extra steps of transparency layered on top. For a deeper walkthrough of how both models stack up, see ",{"type":84,"tag":722,"props":2995,"children":2996},{"href":724},[2997],{"type":90,"value":727},{"type":90,"value":765},{"type":84,"tag":85,"props":3000,"children":3002},{"id":3001},"blockchain-randomness-chainlink-vrf-and-onchain-games",[3003],{"type":90,"value":3004},"Blockchain Randomness — Chainlink VRF and Onchain Games",{"type":84,"tag":93,"props":3006,"children":3007},{},[3008],{"type":90,"value":3009},"PF RNG covers centralized crypto casinos nicely. But what about fully decentralized applications — onchain lotteries, NFT trait assignment, onchain dice? That's where a different solution takes over.",{"type":84,"tag":597,"props":3011,"children":3013},{"id":3012},"why-blockchains-cant-generate-secure-random-numbers",[3014],{"type":90,"value":3015},"Why Blockchains Can't Generate Secure Random Numbers",{"type":84,"tag":93,"props":3017,"children":3018},{},[3019],{"type":90,"value":3020},"Every blockchain is deterministic by design — every validator must produce the same state from the same inputs, or consensus breaks. That makes randomness structurally hard:",{"type":84,"tag":604,"props":3022,"children":3023},{},[3024,3035,3046,3057],{"type":84,"tag":608,"props":3025,"children":3026},{},[3027,3033],{"type":84,"tag":99,"props":3028,"children":3030},{"className":3029},[],[3031],{"type":90,"value":3032},"block.timestamp",{"type":90,"value":3034}," is miner-controllable within a few seconds",{"type":84,"tag":608,"props":3036,"children":3037},{},[3038,3044],{"type":84,"tag":99,"props":3039,"children":3041},{"className":3040},[],[3042],{"type":90,"value":3043},"block.blockhash",{"type":90,"value":3045}," can be manipulated by miners withholding blocks",{"type":84,"tag":608,"props":3047,"children":3048},{},[3049,3055],{"type":84,"tag":99,"props":3050,"children":3052},{"className":3051},[],[3053],{"type":90,"value":3054},"block.prevrandao",{"type":90,"value":3056}," (post-Merge Ethereum) is better but still biasable by validators",{"type":84,"tag":608,"props":3058,"children":3059},{},[3060,3062,3066],{"type":90,"value":3061},"Any onchain entropy source can be read by the contract ",{"type":84,"tag":108,"props":3063,"children":3064},{},[3065],{"type":90,"value":2971},{"type":90,"value":3067}," it's used, defeating the purpose",{"type":84,"tag":93,"props":3069,"children":3070},{},[3071],{"type":90,"value":3072},"Naive dApp lotteries that used blockhash have been drained in the past. The economic incentive to manipulate a $1M jackpot can make a miner rationally withhold a block.",{"type":84,"tag":597,"props":3074,"children":3076},{"id":3075},"how-chainlink-vrf-solves-it",[3077],{"type":90,"value":3078},"How Chainlink VRF Solves It",{"type":84,"tag":93,"props":3080,"children":3081},{},[3082,3087],{"type":84,"tag":126,"props":3083,"children":3084},{},[3085],{"type":90,"value":3086},"Chainlink VRF",{"type":90,"value":3088}," (Verifiable Random Function) generates randomness offchain and delivers it onchain with a cryptographic proof. The flow:",{"type":84,"tag":3090,"props":3091,"children":3092},"ol",{},[3093,3098,3103,3117,3122],{"type":84,"tag":608,"props":3094,"children":3095},{},[3096],{"type":90,"value":3097},"Smart contract requests a random number",{"type":84,"tag":608,"props":3099,"children":3100},{},[3101],{"type":90,"value":3102},"Chainlink oracle generates the value offchain using its private key + request seed",{"type":84,"tag":608,"props":3104,"children":3105},{},[3106,3108,3115],{"type":90,"value":3107},"The proof is a ",{"type":84,"tag":722,"props":3109,"children":3112},{"href":3110,"rel":3111},"https:\u002F\u002Fdocs.chain.link\u002Fvrf",[792],[3113],{"type":90,"value":3114},"BLS signature",{"type":90,"value":3116}," that anyone can verify against the oracle's public key",{"type":84,"tag":608,"props":3118,"children":3119},{},[3120],{"type":90,"value":3121},"Both the value and the proof are posted back onchain in a single transaction",{"type":84,"tag":608,"props":3123,"children":3124},{},[3125],{"type":90,"value":3126},"The contract verifies the proof before using the value",{"type":84,"tag":93,"props":3128,"children":3129},{},[3130],{"type":90,"value":3131},"The critical property: because the proof ties the random value to the oracle's private key and the request seed, the oracle cannot cherry-pick convenient values. Any deviation is mathematically detectable.",{"type":84,"tag":597,"props":3133,"children":3135},{"id":3134},"when-to-use-vrf-vs-hmac-based-pf",[3136],{"type":90,"value":3137},"When to Use VRF vs HMAC-Based PF",{"type":84,"tag":144,"props":3139,"children":3140},{},[3141,3162],{"type":84,"tag":148,"props":3142,"children":3143},{},[3144],{"type":84,"tag":76,"props":3145,"children":3146},{},[3147,3152,3157],{"type":84,"tag":155,"props":3148,"children":3149},{},[3150],{"type":90,"value":3151},"Use case",{"type":84,"tag":155,"props":3153,"children":3154},{},[3155],{"type":90,"value":3156},"Best fit",{"type":84,"tag":155,"props":3158,"children":3159},{},[3160],{"type":90,"value":3161},"Why",{"type":84,"tag":171,"props":3163,"children":3164},{},[3165,3183,3200,3217,3234],{"type":84,"tag":76,"props":3166,"children":3167},{},[3168,3173,3178],{"type":84,"tag":178,"props":3169,"children":3170},{},[3171],{"type":90,"value":3172},"Centralized dice\u002Fcrash",{"type":84,"tag":178,"props":3174,"children":3175},{},[3176],{"type":90,"value":3177},"HMAC-based PF",{"type":84,"tag":178,"props":3179,"children":3180},{},[3181],{"type":90,"value":3182},"Simpler, cheaper, same guarantees",{"type":84,"tag":76,"props":3184,"children":3185},{},[3186,3191,3195],{"type":84,"tag":178,"props":3187,"children":3188},{},[3189],{"type":90,"value":3190},"Onchain lottery",{"type":84,"tag":178,"props":3192,"children":3193},{},[3194],{"type":90,"value":3086},{"type":84,"tag":178,"props":3196,"children":3197},{},[3198],{"type":90,"value":3199},"Trustless, no central operator",{"type":84,"tag":76,"props":3201,"children":3202},{},[3203,3208,3212],{"type":84,"tag":178,"props":3204,"children":3205},{},[3206],{"type":90,"value":3207},"NFT trait assignment",{"type":84,"tag":178,"props":3209,"children":3210},{},[3211],{"type":90,"value":3086},{"type":84,"tag":178,"props":3213,"children":3214},{},[3215],{"type":90,"value":3216},"Non-manipulable rarity",{"type":84,"tag":76,"props":3218,"children":3219},{},[3220,3225,3229],{"type":84,"tag":178,"props":3221,"children":3222},{},[3223],{"type":90,"value":3224},"Centralized blackjack",{"type":84,"tag":178,"props":3226,"children":3227},{},[3228],{"type":90,"value":3177},{"type":84,"tag":178,"props":3230,"children":3231},{},[3232],{"type":90,"value":3233},"Chainlink VRF too expensive per card",{"type":84,"tag":76,"props":3235,"children":3236},{},[3237,3242,3246],{"type":84,"tag":178,"props":3238,"children":3239},{},[3240],{"type":90,"value":3241},"DeFi game with high jackpot",{"type":84,"tag":178,"props":3243,"children":3244},{},[3245],{"type":90,"value":3086},{"type":84,"tag":178,"props":3247,"children":3248},{},[3249],{"type":90,"value":3250},"Miner manipulation risk too high",{"type":84,"tag":93,"props":3252,"children":3253},{},[3254,3256,3262],{"type":90,"value":3255},"Most crypto casinos in 2026 still use HMAC-based PF because it's fast, cheap, and already well-understood. VRF is where onchain DeFi, NFTs, and fully decentralized gaming shine. Our ",{"type":84,"tag":722,"props":3257,"children":3259},{"href":3258},"\u002Fblog\u002Fprovably-fair-bitcoin-games",[3260],{"type":90,"value":3261},"provably fair Bitcoin games",{"type":90,"value":3263}," ranking filters specifically by which PF implementation each casino uses.",{"type":84,"tag":93,"props":3265,"children":3266},{},[3267,3269,3275],{"type":90,"value":3268},"If you want to stress-test these concepts on a live casino, the ",{"type":84,"tag":722,"props":3270,"children":3272},{"href":3271},"\u002Fcasino\u002Fprovably-fair",[3273],{"type":90,"value":3274},"provably fair directory",{"type":90,"value":3276}," lists implementations you can probe without depositing first — most expose server-seed hashes on a public endpoint.",{"type":84,"tag":85,"props":3278,"children":3280},{"id":3279},"attack-surface-of-pf-rngs",[3281],{"type":90,"value":3282},"Attack Surface of PF RNGs",{"type":84,"tag":93,"props":3284,"children":3285},{},[3286],{"type":90,"value":3287},"A cryptographically perfect PF RNG can still be broken by bad implementation. Here's what survives the math.",{"type":84,"tag":597,"props":3289,"children":3291},{"id":3290},"biased-seed-pool-attack",[3292],{"type":90,"value":3293},"Biased Seed Pool Attack",{"type":84,"tag":93,"props":3295,"children":3296},{},[3297],{"type":90,"value":3298},"The most realistic attack — and one reason client seed rotation matters.",{"type":84,"tag":93,"props":3300,"children":3301},{},[3302],{"type":90,"value":3303},"A dishonest casino generates thousands of candidate server seeds in advance. For each, they compute outcomes against common client seed patterns (default browser formats, frequent words). They deploy only seeds that happen to produce more losses than wins against predictable client seeds.",{"type":84,"tag":93,"props":3305,"children":3306},{},[3307],{"type":90,"value":3308},"Every deployed seed still hashes correctly to its pre-committed hash. The commit-reveal math passes. But the pool of available seeds was cherry-picked before any player saw them, and the long-run house edge quietly exceeds the stated RTP.",{"type":84,"tag":3310,"props":3311,"children":3313},"h4",{"id":3312},"why-rotation-defeats-it",[3314],{"type":90,"value":3315},"Why Rotation Defeats It",{"type":84,"tag":93,"props":3317,"children":3318},{},[3319,3321,3325],{"type":90,"value":3320},"Biased-seed attacks require the casino to know your future client seed ",{"type":84,"tag":108,"props":3322,"children":3323},{},[3324],{"type":90,"value":2971},{"type":90,"value":3326}," committing the server seed. Rotate your client seed every 50-100 bets and the casino's pre-computation becomes useless — they committed to a server seed before knowing the new client seed, so they can't steer outcomes.",{"type":84,"tag":93,"props":3328,"children":3329},{},[3330,3332,3338],{"type":90,"value":3331},"This is why legitimate casinos let you rotate instantly. A PF casino that refuses client seed rotation (or auto-regenerates the client seed on their schedule, not yours) is signaling the attack surface is open. The ",{"type":84,"tag":722,"props":3333,"children":3335},{"href":3334},"\u002Fblog\u002Fclient-seed-vs-server-seed",[3336],{"type":90,"value":3337},"client seed vs server seed",{"type":90,"value":3339}," guide covers the full rotation workflow.",{"type":84,"tag":597,"props":3341,"children":3343},{"id":3342},"weak-entropy-sources",[3344],{"type":90,"value":3345},"Weak Entropy Sources",{"type":84,"tag":93,"props":3347,"children":3348},{},[3349],{"type":90,"value":3350},"If the server seed generation uses predictable entropy, the commit-reveal protocol still runs but the attacker can predict seeds.",{"type":84,"tag":3310,"props":3352,"children":3354},{"id":3353},"the-mathrandom-trap",[3355],{"type":90,"value":3356},"The Math.random Trap",{"type":84,"tag":93,"props":3358,"children":3359},{},[3360,3362,3367],{"type":90,"value":3361},"JavaScript's ",{"type":84,"tag":99,"props":3363,"children":3365},{"className":3364},[],[3366],{"type":90,"value":894},{"type":90,"value":3368}," is a linear congruential generator variant. After observing ~700 consecutive outputs, an attacker can reconstruct the full internal state and predict every subsequent output. If a PF casino uses Math.random for server seed generation:",{"type":84,"tag":3090,"props":3370,"children":3371},{},[3372,3377,3382,3393],{"type":84,"tag":608,"props":3373,"children":3374},{},[3375],{"type":90,"value":3376},"Attacker plays 700+ rounds, collecting each revealed server seed",{"type":84,"tag":608,"props":3378,"children":3379},{},[3380],{"type":90,"value":3381},"Attacker reconstructs the PRNG state",{"type":84,"tag":608,"props":3383,"children":3384},{},[3385,3387,3391],{"type":90,"value":3386},"Attacker predicts the next hashed server seed ",{"type":84,"tag":108,"props":3388,"children":3389},{},[3390],{"type":90,"value":2971},{"type":90,"value":3392}," it's committed",{"type":84,"tag":608,"props":3394,"children":3395},{},[3396],{"type":90,"value":3397},"Attacker bets with full knowledge of the outcome",{"type":84,"tag":93,"props":3399,"children":3400},{},[3401,3403,3409,3411,3417],{"type":90,"value":3402},"Prevention: casinos must use ",{"type":84,"tag":99,"props":3404,"children":3406},{"className":3405},[],[3407],{"type":90,"value":3408},"crypto.randomBytes(32)",{"type":90,"value":3410}," (Node.js), ",{"type":84,"tag":99,"props":3412,"children":3414},{"className":3413},[],[3415],{"type":90,"value":3416},"crypto.getRandomValues(new Uint8Array(32))",{"type":90,"value":3418}," (browser), or hardware RNG. The difference is one line of code but the security gap is total.",{"type":84,"tag":597,"props":3420,"children":3422},{"id":3421},"implementation-red-flags",[3423],{"type":90,"value":3424},"Implementation Red Flags",{"type":84,"tag":93,"props":3426,"children":3427},{},[3428],{"type":90,"value":3429},"Short checklist of signals that a PF RNG isn't safe:",{"type":84,"tag":604,"props":3431,"children":3432},{},[3433,3438,3443,3448,3453,3458],{"type":84,"tag":608,"props":3434,"children":3435},{},[3436],{"type":90,"value":3437},"No client seed rotation button, or rotation takes >5 seconds",{"type":84,"tag":608,"props":3439,"children":3440},{},[3441],{"type":90,"value":3442},"Client seed is auto-regenerated by the casino on their schedule",{"type":84,"tag":608,"props":3444,"children":3445},{},[3446],{"type":90,"value":3447},"Server seed history doesn't show the algorithm or slice width",{"type":84,"tag":608,"props":3449,"children":3450},{},[3451],{"type":90,"value":3452},"Verification tool only works on the casino's own website (not locally)",{"type":84,"tag":608,"props":3454,"children":3455},{},[3456],{"type":90,"value":3457},"No published hash algorithm — \"SHA-256 somewhere\" isn't enough; you need the exact formula",{"type":84,"tag":608,"props":3459,"children":3460},{},[3461],{"type":90,"value":3462},"Revealed server seeds don't match their pre-committed hashes in any round",{"type":84,"tag":93,"props":3464,"children":3465},{},[3466,3468,3472],{"type":90,"value":3467},"Any one of these suggests the PF claim is marketing varnish on top of a regular RNG. For a side-by-side on which casinos actually publish their PF code, see the ",{"type":84,"tag":722,"props":3469,"children":3470},{"href":3258},[3471],{"type":90,"value":3261},{"type":90,"value":3473}," ranking.",{"type":84,"tag":85,"props":3475,"children":3477},{"id":3476},"try-it-yourself-interactive-verifier",[3478],{"type":90,"value":3479},"Try It Yourself — Interactive Verifier",{"type":84,"tag":93,"props":3481,"children":3482},{},[3483],{"type":90,"value":3484},"The math stops being abstract the moment you run it on your own seeds. Paste any four values from your casino's fairness panel into the verifier below — everything executes in your browser via the Web Crypto API, no data is sent to our server.",{"type":84,"tag":3486,"props":3487,"children":3488},"inline-provably-fair-verifier",{},[],{"type":84,"tag":93,"props":3490,"children":3491},{},[3492],{"type":90,"value":3493},"A practical tip: if you don't have a real PF casino bet handy, try these throwaway test values to see a verified round:",{"type":84,"tag":604,"props":3495,"children":3496},{},[3497,3510,3521,3532],{"type":84,"tag":608,"props":3498,"children":3499},{},[3500,3502,3508],{"type":90,"value":3501},"Server seed hash: ",{"type":84,"tag":99,"props":3503,"children":3505},{"className":3504},[],[3506],{"type":90,"value":3507},"bf3c0a9b0f4b3c8e8f4f0c5f0c4e8b7d8f3e2a1c9f6e3b7c4d5a8e2f9b1c6d3a",{"type":90,"value":3509}," (example only — won't match real hashes)",{"type":84,"tag":608,"props":3511,"children":3512},{},[3513,3515],{"type":90,"value":3514},"Server seed: ",{"type":84,"tag":99,"props":3516,"children":3518},{"className":3517},[],[3519],{"type":90,"value":3520},"f4a9c2e1b7d8e3c5a1b9f6d2e8c4a7b3e9d1c6a2b5f8e4c7a3b6e1d9c2a5b8f4",{"type":84,"tag":608,"props":3522,"children":3523},{},[3524,3526],{"type":90,"value":3525},"Client seed: ",{"type":84,"tag":99,"props":3527,"children":3529},{"className":3528},[],[3530],{"type":90,"value":3531},"demo-player",{"type":84,"tag":608,"props":3533,"children":3534},{},[3535,3537],{"type":90,"value":3536},"Nonce: ",{"type":84,"tag":99,"props":3538,"children":3540},{"className":3539},[],[3541],{"type":90,"value":1999},{"type":84,"tag":93,"props":3543,"children":3544},{},[3545,3547,3553,3555,3560,3562,3568,3570,3576,3578,3584],{"type":90,"value":3546},"The result shows a PASS \u002F FAIL verdict on hash match plus the reconstructed dice and crash outcomes. The same logic runs behind the ",{"type":84,"tag":722,"props":3548,"children":3550},{"href":3549},"\u002Fblog\u002Fprovably-fair-aviator-calculator",[3551],{"type":90,"value":3552},"Aviator provably fair calculator",{"type":90,"value":3554}," for Spribe's crash-style game, and our full verifier at ",{"type":84,"tag":722,"props":3556,"children":3557},{"href":3271},[3558],{"type":90,"value":3559},"the provably fair hub",{"type":90,"value":3561}," covers every mainstream PF casino. For sizing bets against a known RTP once you've confirmed the RNG is legit, pair it with our ",{"type":84,"tag":722,"props":3563,"children":3565},{"href":3564},"\u002Fcasino\u002Frtp-calculator",[3566],{"type":90,"value":3567},"RTP calculator",{"type":90,"value":3569},", ",{"type":84,"tag":722,"props":3571,"children":3573},{"href":3572},"\u002Fcasino\u002Fhouse-edge-calculator",[3574],{"type":90,"value":3575},"house edge calculator",{"type":90,"value":3577},", and ",{"type":84,"tag":722,"props":3579,"children":3581},{"href":3580},"\u002Fcasino\u002Fbankroll-calculator",[3582],{"type":90,"value":3583},"bankroll calculator",{"type":90,"value":765},{"type":84,"tag":93,"props":3586,"children":3587},{},[3588,3593,3595,3600],{"type":84,"tag":126,"props":3589,"children":3590},{},[3591],{"type":90,"value":3592},"Bottom line:",{"type":90,"value":3594}," the math is bulletproof only if the casino actually publishes the hash before the bet. Double-check every implementation against the ",{"type":84,"tag":722,"props":3596,"children":3597},{"href":3271},[3598],{"type":90,"value":3599},"provably fair hub",{"type":90,"value":3601}," — we note whether each venue locks in the seed correctly and where the hash is exposed.",{"type":84,"tag":85,"props":3603,"children":3605},{"id":3604},"faq",[3606],{"type":90,"value":3607},"FAQ"]