Plinko: from floats to a bucket to a multiplier
How a Stake-scheme Plinko drop turns one float per row into left/right steps and a bucket, and how the published multiplier table sets the edge.
Disclosure: VerifyRoll is sponsored by Craze, a competitor of the operators whose published RTP appears below. Figures here are computed or taken from what operators publish, dated; nothing is estimated.
How the result is derived
Under the Stake scheme every result starts from HMAC-SHA256(server seed, “clientSeed:nonce:cursor”), read four bytes at a time into floats in [0, 1). Plinko consumes one float per row (8, 12 or 16).
- Generate as many floats as there are rows: 8, 12 or 16. The first HMAC gives 8 floats; 12 or 16 rows need a second HMAC with cursor 1.
- For each float, compute floor(float × 2): 0 means the ball steps left at that row, 1 means right.
- The bucket is the number of right steps. Bucket 0 is the far left, bucket = rows is the far right.
bucket = Σ floor(float_i × 2) for i = 1 … rows
Payout rule and where the edge comes from
The bucket indexes the operator's multiplier table for that row count and risk level. VerifyRoll carries the table Stake publishes; other operators publish their own.
Because each step is a fair coin, bucket k is reached in C(rows, k) of 2^rows equally likely paths. The centre buckets are common and pay little; the edges are rare and pay a lot.
Source of the edge. The path is unbiased. The edge is whatever the multiplier table leaves out: sum probability × multiplier across all buckets and you get the RTP. The figures below are computed from the table, not copied from a fairness page.
| rows | low | medium | high |
|---|---|---|---|
| 8 | 98.9844% | 98.9063% | 99.0625% |
| 12 | 98.9795% | 98.9893% | 99.1162% |
| 16 | 98.9987% | 98.9883% | 98.9764% |
RTP of each published table, computed as Σ C(rows, k) × multiplier ÷ 2^rows. Exact fractions in the Plinko calculator.
Worked example
Computed on the server by the same functions the verifier runs, from the example values the verifier's “Load example values” button uses. These are not seeds from a real round.
- server seed
- 2b4d2f1a7c9e0f3b8a6d5c4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a
- client seed
- verifyroll
- nonce
- 7
- rows / risk
- 16 / medium
- HMAC-SHA256(server seed, “verifyroll:7:0”)81727d41db6b44706ddfd681ab9cd0124cc482392adbbdda8ac8ac626566bf1a
- HMAC-SHA256(server seed, “verifyroll:7:1”)c2c07f6bc3f0feddd98e7bd8b9e1bb233dfcbb5b6f96e9deb6d585c6cf3f461f
- Floats (16): 0.50565322 0.85710552 0.42919675 0.67036152 0.29987348 0.16741549 0.54212453 0.39609904 0.76074978 0.76539605 0.84983038 0.72610063 0.24213763 0.43589651 0.71419560 0.80955923
- directions = R R L R L L R L R R R R L L R R
- bucket = number of rights = 10 (0 = far left, 16 = far right)
result
bucket 10 of 16
Published multiplier at 16 rows, medium risk, for this bucket: 1×
Reproduce this in the verifierPublished RTP by operator
| Stake | Shuffle | BC.Game | Craze |
|---|---|---|---|
| 99% | 99% | 99% | — |
Checked 2026-09-23. “—” means not offered or not published. The figure in your game's info panel wins.
Questions
- Why does 16 rows need two HMAC rounds?
- Each HMAC-SHA256 output is 32 bytes, and each float consumes 4 bytes, so one round yields 8 floats. Rows 9 through 16 come from the round with cursor 1.
- Does the table make the RTP exactly 99%?
- No. The published tables land within a fraction of a percent of 99% and differ by rows and risk. The Plinko calculator shows the exact figure for every combination.
Next
- Bucket probabilities and exact RTP
- Verify a Plinko bet of your own, or by operator: Stake Plinko verifier · Shuffle Plinko verifier
- Play Plinko for free on PlinkoLab (play money, same derivation)
- House edge for every game and operator
last reviewed 2026-09-23 · derivation as implemented in @craze/fairness