GAME NOTES

A roulette bet is a string: self-describing keys and the ×36 table

Illustration for “A roulette bet is a string: self-describing keys and the ×36 table”
On this site a roulette bet is a self-describing key: a short string such as n:17 for a straight, sp:16-17 for a split, co:16-17-19-20 for a corner, dz:2 for the second dozen or ev:red for red. The engine decodes each key into the set of pockets it covers, checks that the set is the right size for its kind and lies on the table, and settles the spin by asking one question per key: is the pocket in the set? The multipliers are total-return and match the standard European table, ×36 for a straight down to ×2 for an even chance, and they share one property that the design makes visible: multiplier × pockets covered = 36 for every kind of bet. On a single-zero wheel with 37 pockets that means every bet, from a straight to red, returns 36 ÷ 37 = 97.30% and carries the same 2.7% edge, including the first-four bet that on other layouts is the worst on the table. The pocket itself is floor(u × 37) from cursor 0 of the round’s hash, so one spin settles any number of keys at once.
BETKYO RESEARCHPUBLISHED 2026-09-11UPDATED 2026-09-117 MIN READ

The problem with a felt

A roulette layout is a map. Where a chip sits on it says what it covers: on a number, across a line between two, on a corner of four, at the end of a column. A physical dealer reads the map; a settlement engine has to encode it, and the obvious encoding, a table of positions and the numbers each one touches, is exactly the kind of data that is easy to get subtly wrong and hard to check. A corner that lists the wrong fourth number pays wrongly forever and nobody notices until someone does.

The engine here avoids the map entirely. A bet is not a position; it is a string that names its own kind and its own numbers. The interface produces the string when you click the felt, and from then on the felt is irrelevant. The settlement code never asks where a chip was. It asks what the string says.

The keys

Roulette bet keys, what they cover, and what they pay as total return
KEYBETPOCKETS COVEREDPAYSCOVERED × PAYS
n:17Straight1×3636
sp:16-17Split2×1836
st:16-17-18Street3×1236
co:16-17-19-20Corner4×936
f4:0-1-2-3First four4×936
sl:16-…-21Six line6×636
dz:1 | 2 | 3Dozen12×336
col:1 | 2 | 3Column12×336
ev:red | black | odd | even | low | highEven chance18×236

Total-return multiples: ×36 means the stake back plus 35. Column c is the numbers congruent to c modulo 3, with column 3 taking the multiples of 3. The last column is the same for every row, which is the whole point.

ENGINE-VERIFIEDroulette/derive.ts header: bet keys “n:17 straight ×36 · sp:16-17 split ×18 · st:16-17-18 street ×12 · co:16-17-19-20 corner ×9 · sl:16-…-21 six line ×6 · f4:0-1-2-3 first four ×9 · dz:1|2|3 dozen ×3 · col:1|2|3 column ×3 (col c = numbers ≡ c mod 3, col 3 ≡ 0) · ev:red|black|odd|even|low|high even chances ×2”; “Multipliers are total-return (stake included), matching standard European payouts … Single zero — house edge 2.7%.” rouletteMultOf(key) switches on the prefix before the colon and returns those multiples; rouletteNumbersOf(key) expands the key to its pocket list.

Settlement is then one line per key: expand the key to its pockets, check whether the spun pocket is among them, and if so multiply the stake by the kind’s multiplier. Because the pocket comes from a single cursor of the round’s hash, one spin settles every key on the table in the same pass, and the demo engine’s comment says so in as many words: one roll settles a whole table of bets, roulette-style.

The belt and the braces

A string that describes its own bet can also describe a bet that does not exist: a split of two numbers that are not neighbours, a corner with five entries, a straight on 40. The interface never produces those, but an engine that settles money should not trust an interface. So every key is validated before it is priced: its kind must be known, its number list must be exactly the size that kind covers, every number must be between 0 and 36, and none may repeat. A key that fails is refused, not settled.

ENGINE-VERIFIEDroulette/derive.ts rouletteKeyValid: “a key is legal iff it decodes to the right cover size for its kind and its numbers are on the table — the UI only produces legal keys, this is the belt”; the size table is { n: 1, sp: 2, st: 3, co: 4, sl: 6, f4: 4, dz: 12, col: 12 } with even chances required to cover exactly 18, and every number must be an integer in 0…36 with no duplicates.

What the validator does not check is adjacency: it accepts sp:1-36 as a two-number bet. That is a deliberate looseness rather than a hole, because the price of a two-number bet is the same whether or not the numbers touch. The ×18 is for covering two pockets out of thirty-seven, not for the geometry of the felt, and a player who somehow submitted a non-adjacent split would be paid exactly what a split is worth.

One number: thirty-six

The last column of the table is the reason to write the article. For every kind of bet, the multiplier times the number of pockets covered is 36. That is not a coincidence of the standard European payouts; it is what they are. A bet that covers k pockets on a 37-pocket wheel wins with probability k ÷ 37 and returns 36 ÷ k, so its expected return is 36 ÷ 37 whatever k is. Every bet on the table costs the same 2.7%.

  • There is no good bet and no bad bet on this wheel. Straight, split, dozen and red are the same price in different volatilities, exactly as Sic Bo’s boxes are not.
  • The first four is an ordinary bet here. On American layouts the five-number basket pays ×7 on 5 pockets out of 38, a worse price than everything else; f4 pays ×9 on 4 of 37, which multiplies out to 36 like the rest.
  • The edge is the zero. Thirty-six pockets’ worth of payout on thirty-seven pockets; the missing pocket is the whole house edge, and there is one of it.
Keys and multipliers are read from the client derivation module, which the source describes as shared by the demo engine and the browser verifier; the house service is the paying authority. This is a design note about encoding, not a betting recommendation.
FAQ

How is a roulette bet represented on this site?

As a self-describing string: a kind prefix and the numbers it covers, such as n:17, sp:16-17, co:16-17-19-20, dz:2 or ev:red. The engine decodes the string to its pocket set and settles by membership.

What does each bet pay?

Total return: straight ×36, split ×18, street ×12, corner ×9, first four ×9, six line ×6, dozen ×3, column ×3, even chances ×2. These match the standard European table.

Why is every bet the same price?

Because for every kind the multiplier times the pockets covered equals 36, on a wheel with 37 pockets. Expected return is 36 ÷ 37 = 97.30% and the edge is 2.7% for every bet.

What stops a malformed bet?

A validator that requires a known kind, exactly the right number of pockets for that kind, every number in 0…36, and no duplicates. Keys that fail are refused before settlement.

How is the pocket chosen?

floor(u × 37), where u comes from cursor 0 of the round’s hash of the committed server seed, your client seed and the round number. One spin settles every key placed on it.

SOURCES & REFERENCES
  • Betkyo engine source: roulette/derive.ts (bet keys, rouletteNumbersOf, rouletteMultOf, rouletteKeyValid, ROULETTE_ORDER, ROULETTE_RED), _shared/demoLocal.ts (roulette settlement)
THE GAMES IN THIS ARTICLE
Betkyo Research — written by the team that builds these games. Every probability quoted in the Journal is derived from our engine source or a cited reference, never copied from another site. Figures are re-checked whenever the engines change.

18+ · PLAY RESPONSIBLY · THE JOURNAL IS EDITORIAL CONTENT, NOT BETTING ADVICE