<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Betkyo Research</title>
    <description>The latest articles on DEV Community by Betkyo Research (@betkyo).</description>
    <link>https://dev.to/betkyo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4121818%2F5507dc9d-30ad-405a-a708-d12c050e190e.png</url>
      <title>DEV Community: Betkyo Research</title>
      <link>https://dev.to/betkyo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/betkyo"/>
    <language>en</language>
    <item>
      <title>The denominator problem: pricing an hour of a fixed-pool airdrop</title>
      <dc:creator>Betkyo Research</dc:creator>
      <pubDate>Thu, 22 Oct 2026 02:46:32 +0000</pubDate>
      <link>https://dev.to/betkyo/the-denominator-problem-pricing-an-hour-of-a-fixed-pool-airdrop-9l7</link>
      <guid>https://dev.to/betkyo/the-denominator-problem-pricing-an-hour-of-a-fixed-pool-airdrop-9l7</guid>
      <description>&lt;p&gt;Every "play-to-airdrop" game has the same hidden variable, and it is not the token price. It is the number of other players.&lt;/p&gt;

&lt;p&gt;Here is the arithmetic with one real example. Hamster Kombat announced 300 million players on 30 July 2024 and a whitepaper giving 60% of its token to them. The airdrop landed on 26 September 2024: 131 million accounts qualified. Sixty percent of a 100 billion supply is 60 billion tokens, so the average share was&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;60_000_000_000 / 131_000_000 ≈ 458 tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the listing price (about $0.011) that is $5.04. The token fell about 30% on day one and reached $0.0025 by 1 November, which makes the average share $1.15. If a player tapped ten minutes a day for the six months between launch and airdrop, that is 30 hours, so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5.04 / 30 ≈ $0.17 per hour at listing
1.15 / 30 ≈ $0.04 per hour six weeks later
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The part people miss is the direction of the growth term. In a casino game the payout rule is per bet and does not depend on how many other people are playing: a dice roll that pays 1.98× at a 50% chance pays that whether a thousand people or a hundred million are rolling. In a fixed-pool airdrop the payout is &lt;code&gt;pool / N&lt;/code&gt;, so every announcement of "more players" is an announcement that your share got smaller. A player who tapped twice as much did not double their hourly rate; they raised the denominator for everyone, themselves included.&lt;/p&gt;

&lt;p&gt;A small function makes the comparison concrete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;per_hour_fixed_pool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pool_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;players&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pool_tokens&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;players&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;hours&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;per_hour_fixed_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stake&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hands_per_hour&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# expected cost (negative return) per hour, known before you play
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;edge&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;stake&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;hands_per_hour&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;per_hour_fixed_pool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;60e9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;131e6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.011&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 0.168
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;per_hour_fixed_pool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;60e9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;131e6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0025&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# 0.038
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;per_hour_fixed_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;           &lt;span class="c1"&gt;# -6.0  (1% edge, $1 bets, 600 rolls/h)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neither number is a recommendation. The second one is negative, as every house-edge game is. But the second one is known before the first roll, and the first one is known only after the pool, the headcount and the price are all fixed, which in this case was six months after people started playing. The mini-app's own monthly counter, readable by anyone, went from over 100 million in late September to about 41 million by early November. That curve is what "finding out the price of an hour" looks like at scale.&lt;/p&gt;

&lt;p&gt;I work on the Betkyo Journal, where we publish this kind of derivation for casino games with the engine source as the reference. The full write-up, with the sources (Decrypt, Cointelegraph, ForkLog, BitPinas, CoinGecko), is here: &lt;a href="https://betkyo.com/en/blog/hamster-kombat-300-million-players-a-60-billion-token-airdrop-and-the-month-they-left/" rel="noopener noreferrer"&gt;https://betkyo.com/en/blog/hamster-kombat-300-million-players-a-60-billion-token-airdrop-and-the-month-they-left/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;18+. Not financial advice.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>math</category>
      <category>python</category>
      <category>web3</category>
    </item>
    <item>
      <title>Parlay math: why four coin flips pay 13-to-1, and what an insider does to that number</title>
      <dc:creator>Betkyo Research</dc:creator>
      <pubDate>Mon, 19 Oct 2026 02:26:49 +0000</pubDate>
      <link>https://dev.to/betkyo/parlay-math-why-four-coin-flips-pay-13-to-1-and-what-an-insider-does-to-that-number-5d30</link>
      <guid>https://dev.to/betkyo/parlay-math-why-four-coin-flips-pay-13-to-1-and-what-an-insider-does-to-that-number-5d30</guid>
      <description>&lt;p&gt;A parlay is a bet that several outcomes all happen. The payout multiplies, which is why it feels like a lottery ticket, and the pricing is simple enough to put in one function.&lt;/p&gt;

&lt;p&gt;American odds of −110 mean you risk 110 to win 100: a winning ticket returns 210/110 ≈ 1.909 × the stake. A four-leg parlay of −110 legs returns 1.909⁴ ≈ 13.3× — close to the $80,000 → $1.1 million (13.75×) ticket in the Jontay Porter case.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;american&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;american&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;american&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;american&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parlay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;legs_american&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p_each&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;payout multiple and true win probability for independent legs&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;mult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;legs_american&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;mult&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="nf"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;p_each&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mult&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;   &lt;span class="c1"&gt;# multiple, hit rate, expected return per $1
&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;parlay&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;          &lt;span class="c1"&gt;# (13.28, 0.0625, 0.83)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;parlay&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.9999&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;       &lt;span class="c1"&gt;# (13.28, 0.9996, 13.28)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things to read off the numbers.&lt;/p&gt;

&lt;p&gt;First, the honest case. Four genuine coin-flips at −110 hit 6.25% of the time and return about 83 cents per dollar: the sportsbook's ~4.5% edge per leg compounds to ~17% over the parlay. Parlays are expensive because the vig is charged four times, not because the multiplier is dishonest.&lt;/p&gt;

&lt;p&gt;Second, the dishonest case. The multiplier does not change when one participant can make the legs certain. If a player can sit after three minutes, every "under" on his card resolves in his favour, each leg's probability goes to ~1, and the same 13.3× ticket returns ~13 dollars per dollar. The sportsbook's price assumed a coin; the insider was betting on a chair.&lt;/p&gt;

&lt;p&gt;That asymmetry is specific to unders. An over needs minutes, the ball and made shots — nobody can guarantee it. An under needs only the player to stop. Which is why the NBA's fix in October 2026 was not a better line but no line: single-player under parlays, unders on low-minute players, opening-tip and missed-shot bets are gone from its sportsbook partners.&lt;/p&gt;

&lt;p&gt;A general rule falls out of it: a market can be priced only when every participant watches the outcome from outside. Provably fair casino games get that property by construction (the result is a committed function nobody can touch after the bet); sports can only get it by withdrawing the bets an insider can decide.&lt;/p&gt;

&lt;p&gt;The full write-up, with the NBA's findings and the court record: &lt;a href="https://betkyo.com/en/blog/jontay-porter-the-under-only-the-player-can-guarantee-and-the-bets-the-nba-just-removed/" rel="noopener noreferrer"&gt;https://betkyo.com/en/blog/jontay-porter-the-under-only-the-player-can-guarantee-and-the-bets-the-nba-just-removed/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>probability</category>
      <category>python</category>
      <category>statistics</category>
      <category>math</category>
    </item>
    <item>
      <title>"Provably fair" is a claim about one function. Here is what it does and doesn't cover</title>
      <dc:creator>Betkyo Research</dc:creator>
      <pubDate>Sat, 17 Oct 2026 01:52:03 +0000</pubDate>
      <link>https://dev.to/betkyo/provably-fair-is-a-claim-about-one-function-here-is-what-it-does-and-doesnt-cover-4og3</link>
      <guid>https://dev.to/betkyo/provably-fair-is-a-claim-about-one-function-here-is-what-it-does-and-doesnt-cover-4og3</guid>
      <description>&lt;p&gt;Every crypto casino says "provably fair". After the Stake hack of September 2023 — about $41 million out of hot wallets in minutes, games untouched, FBI naming Lazarus a few days later — it is worth being precise about what the phrase proves, because it is a claim about exactly one function and nothing else.&lt;/p&gt;

&lt;p&gt;The function is a commitment scheme. Before you bet, the server publishes &lt;code&gt;hash(serverSeed)&lt;/code&gt;. You contribute a &lt;code&gt;clientSeed&lt;/code&gt;. Each round derives its result from &lt;code&gt;(serverSeed, clientSeed, nonce)&lt;/code&gt; through a public algorithm. When the server seed rotates, the old one is revealed, and you check two things: that it hashes to the commitment you saw, and that re-running the public derivation reproduces every result you were paid on.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hmac&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_seed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client_seed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;digest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hmac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_seed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_seed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mh"&gt;0x100000000&lt;/span&gt;   &lt;span class="c1"&gt;# uniform in [0, 1)
&lt;/span&gt;
&lt;span class="c1"&gt;# after rotation:
&lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_seed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;committed_hash&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_seed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client_seed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;what_the_site_paid_on_round_17&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(The exact derivation differs per site — ours is published with each game — but the shape is always this.)&lt;/p&gt;

&lt;p&gt;What that proves, if both asserts pass:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The house could not have chosen this round's result after seeing your bet. The seed was fixed before you played.&lt;/li&gt;
&lt;li&gt;The house did not pay you on a different result than the one the seed produced.&lt;/li&gt;
&lt;li&gt;Across the whole seed's life, the results were what the algorithm says, so the house edge was the published one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it does not prove — and what no amount of hashing can prove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;That the site is solvent.&lt;/strong&gt; The commitment is about results, not balances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;That your balance can be spent only by you.&lt;/strong&gt; Custody is a question of keys, signing services and who has access to them. Stake's games verified perfectly on the day its signing service signed for a stranger.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;That the client seed you see is the one used.&lt;/strong&gt; You should set it yourself; a default you did not choose is still fair but gives you nothing to check against.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;That tomorrow's seed will be honest.&lt;/strong&gt; Each commitment covers one seed's lifetime. Verification is something you keep doing, not something you did once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the sentence "the games are provably fair" has a precise truth value you can check with a dozen lines of Python, and the sentence "your money is safe" has none you can check at all. The second is a trust decision, and the only lever you hold on it is exposure: what you leave on a site is a loan to its hot wallet.&lt;/p&gt;

&lt;p&gt;Longer version, with the Stake timeline and the FBI attribution: &lt;a href="https://betkyo.com/en/blog/the-stake-hack-41-million-in-nine-hours-and-the-vault-provably-fair-does-not-cover/" rel="noopener noreferrer"&gt;https://betkyo.com/en/blog/the-stake-hack-41-million-in-nine-hours-and-the-vault-provably-fair-does-not-cover/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>cryptography</category>
      <category>webdev</category>
      <category>cryptocurrency</category>
    </item>
    <item>
      <title>What a random scratch ticket should look like (and why the 2003 one didn't)</title>
      <dc:creator>Betkyo Research</dc:creator>
      <pubDate>Tue, 13 Oct 2026 01:39:35 +0000</pubDate>
      <link>https://dev.to/betkyo/what-a-random-scratch-ticket-should-look-like-and-why-the-2003-one-didnt-1am2</link>
      <guid>https://dev.to/betkyo/what-a-random-scratch-ticket-should-look-like-and-why-the-2003-one-didnt-1am2</guid>
      <description>&lt;p&gt;In 2003 a Toronto geostatistician, Mohan Srivastava, noticed that an Ontario tic-tac-toe scratch ticket could be read before it was scratched. The ticket printed eight tic-tac-toe boards on its face, 72 visible numbers from 1 to 39. Numbers that appeared exactly once on the ticket — he called them singletons — were almost always the hidden numbers under the latex, and three singletons in a line marked a winner about 90% of the time. He reported it and the game was pulled.&lt;/p&gt;

&lt;p&gt;The interesting engineering question is the inverse one: what would a ticket look like if its face really were random? If you know that, you know what a leak looks like.&lt;/p&gt;

&lt;p&gt;Draw 72 numbers independently and uniformly from 1..39. The chance that a given visible number appears exactly once on the ticket is the chance none of the other 71 cells repeat it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;p_single&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;71&lt;/span&gt;        &lt;span class="c1"&gt;# ≈ 0.158
&lt;/span&gt;&lt;span class="n"&gt;expected_singletons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p_single&lt;/span&gt;   &lt;span class="c1"&gt;# ≈ 11.4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So a random ticket carries about eleven singletons, scattered with no relation to anything. Here is the same thing by simulation, plus the count of three-singleton lines on the eight boards (a 3×3 board has 8 lines):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;

&lt;span class="n"&gt;LINES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;singleton_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;single&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;boards&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;single&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;boards&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;LINES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100_000&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;
&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;singleton_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ticket&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;singletons per ticket ≈ &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, three-singleton lines per ticket ≈ &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On my run (100,000 tickets): 11.37 singletons and 0.236 three-singleton lines per ticket, with 20.6% of tickets showing at least one such line. So on a genuinely random face, one ticket in five would show a line of singletons by pure chance, and it would mean nothing — the hidden numbers would have no reason to match it.&lt;/p&gt;

&lt;p&gt;The 2003 ticket was not that. Its face was written by the same program that decided which tickets win, and a program that has to print a fixed number of winners per pack has to coordinate the face with the latex. Srivastava's singletons were not a statistical accident; they were the generator's fingerprints. The lesson generalises to anything that promises randomness but must also hit a quota: the quota is information, and information leaks.&lt;/p&gt;

&lt;p&gt;The full story, including what a scratch card drawn from a committed seed does differently (no pack, no quota, each card an independent draw you can recompute afterwards), is on the Betkyo Journal: &lt;a href="https://betkyo.com/en/blog/mohan-srivastava-the-statistician-who-read-scratch-tickets-without-scratching-them/" rel="noopener noreferrer"&gt;https://betkyo.com/en/blog/mohan-srivastava-the-statistician-who-read-scratch-tickets-without-scratching-them/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Figures from Wired ("Cracking the Scratch Lottery Code", 2011) and NPR (2011); the simulation is mine.&lt;/p&gt;

</description>
      <category>statistics</category>
      <category>python</category>
      <category>probability</category>
      <category>math</category>
    </item>
    <item>
      <title>Doubling $100, priced: the chance of doubling before busting at every stake, every edge and every odds</title>
      <dc:creator>Betkyo Research</dc:creator>
      <pubDate>Mon, 12 Oct 2026 08:00:40 +0000</pubDate>
      <link>https://dev.to/betkyo/doubling-100-priced-the-chance-of-doubling-before-busting-at-every-stake-every-edge-and-every-2mdj</link>
      <guid>https://dev.to/betkyo/doubling-100-priced-the-chance-of-doubling-before-busting-at-every-stake-every-edge-and-every-2mdj</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://betkyo.com/en/blog/doubling-100-dollars-priced-the-chance-of-doubling-before-busting-at-every-stake-and-edge/" rel="noopener noreferrer"&gt;Betkyo Journal&lt;/a&gt;. Drafted with AI assistance; every figure was checked against the game engine source and approved by a human editor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Walk in with $100 and leave with $200 or nothing: a single all-in bet at ×1.98 gets you to $198 just under half the time. The same game at $1 a bet reaches $200 11% of the time, and at Chinchiro’s 2.6% edge, half a percent. Here is the whole table — why small bets lose more often than big ones, why a 1-in-100 long shot doubles you more often than a coin flip at the same stake, and what the house edge really buys the house.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In short:&lt;/strong&gt; With a &lt;strong&gt;1% edge&lt;/strong&gt; even-money bet (our dice at 50%, ×1.98) one all-in bet reaches $198 &lt;strong&gt;49.995%&lt;/strong&gt; of the time; betting to reach &lt;strong&gt;$200&lt;/strong&gt; at a fixed stake, the chance is &lt;strong&gt;42.2%&lt;/strong&gt; at $10 a bet, &lt;strong&gt;25.9%&lt;/strong&gt; at $2, &lt;strong&gt;11.2%&lt;/strong&gt; at $1 and &lt;strong&gt;1.6%&lt;/strong&gt; at 50 cents. The house edge is paid per bet, so the more bets a session takes, the more of it you pay: at $1 a bet the session lasts about &lt;strong&gt;7,600 bets&lt;/strong&gt; on average. At a &lt;strong&gt;2.6% edge&lt;/strong&gt; (Chinchiro) $1 bets double you &lt;strong&gt;0.55%&lt;/strong&gt; of the time; at &lt;strong&gt;2.78%&lt;/strong&gt; (Sic Bo Big/Small) &lt;strong&gt;0.41%&lt;/strong&gt;. Odds matter too: at $1 a bet on dice, a &lt;strong&gt;1-in-100 shot at ×100&lt;/strong&gt; doubles you &lt;strong&gt;41%&lt;/strong&gt; of the time against the coin flip’s 11%, because it settles the question in far fewer bets. The only number that does not change is the average: every path returns 99 cents on the dollar wagered.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question
&lt;/h2&gt;

&lt;p&gt;Most sessions have an unspoken target: double it, or go home. Put a number on it and the question becomes exact — with $100, a fixed stake and a known edge, what is the chance of reaching $200 before reaching $0? This is the gambler’s-ruin problem, and because our games publish their win chances and multipliers, it can be answered for each of them without a single assumption.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Engine-verified.&lt;/strong&gt; Win chances and payouts are read from the engines. Dice (OriginalBaseDiceService.kt): 9,999 equally likely results, multiplier = (1 − house edge) ÷ win chance floored to two decimals, so “over 50.00” wins 4,999 of 9,999 (49.995%) and pays ×1.98, “over 66.67” wins 33.32% at ×2.97, “over 90.00” wins 9.99% at ×9.90 and “over 99.00” wins 0.99% at ×100.00. Koban Flip pays ×1.96 on a fair coin. Sic Bo Big and Small (SicboEngine.kt) pay ×2 on 105 of 216 rolls. Chinchiro (ChinchiroDerivation.kt) returns 97.38% and is treated as an even-money bet won 48.69% of the time. Doubling chances come from replaying 200,000 sessions per cell with the engine’s exact steps — a win adds stake × (multiplier − 1), a loss removes the stake — until the bankroll is $200 or more, or too small for the next bet (±0.1 point). The fair coin and the Chinchiro model use the even-money gambler’s-ruin closed form, (1 − (q/p)ᴺ) ÷ (1 − (q/p)²ᴺ), which the replay reproduces.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The stake is the lever
&lt;/h2&gt;

&lt;p&gt;Take the simplest case: dice at a 50% target, ×1.98, a 1% edge. Bet the whole $100 once and you are at $198 or $0 with the chance of winning, 49.995% — as close to doubling as a ×1.98 bet can get in one step. Bet smaller, aiming for $200, and two things happen — the session takes more bets, and every bet hands over 1% of the stake on average. The edge is a toll per bet, and small stakes pay it more often.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dice at 50% (×1.98, 1% edge): $100, bet until $200 or $0&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;STAKE&lt;/th&gt;
&lt;th&gt;STAKE AS % OF $100&lt;/th&gt;
&lt;th&gt;CHANCE OF DOUBLING&lt;/th&gt;
&lt;th&gt;BETS ON AVERAGE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$100, one bet&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;49.995% (to $198)&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;42.18%&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;5%&lt;/td&gt;
&lt;td&gt;38.62%&lt;/td&gt;
&lt;td&gt;399&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$2&lt;/td&gt;
&lt;td&gt;2%&lt;/td&gt;
&lt;td&gt;25.92%&lt;/td&gt;
&lt;td&gt;2,343&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$1&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;td&gt;11.22%&lt;/td&gt;
&lt;td&gt;7,634&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;1.64%&lt;/td&gt;
&lt;td&gt;19,137&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Target $200 or more; bust when the bankroll can no longer cover the stake. On a fair coin paying ×2 every row would read 50%. The gap between 50% and each figure is what the 1% edge costs over the number of bets the session takes to resolve.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read the last two rows twice. At $1 a bet, $100 doubles about one time in nine; at 50 cents, about one time in sixty. Nothing about the game changed between the rows — only how many times you let the house take its 1%. “Play small to make it last” is true: the session lasts 7,600 bets at $1. It just almost never ends at $200.&lt;/p&gt;

&lt;h2&gt;
  
  
  The edge compounds through the bets
&lt;/h2&gt;

&lt;p&gt;A bigger edge does the same thing faster. Here are our even-money-style games at two stakes, with the chance of doubling $100.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doubling $100, by game and stake&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;GAME&lt;/th&gt;
&lt;th&gt;EDGE&lt;/th&gt;
&lt;th&gt;$10 A BET&lt;/th&gt;
&lt;th&gt;$1 A BET&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fair coin (for reference)&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;50.00%&lt;/td&gt;
&lt;td&gt;50.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dice at 50%, ×1.98&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;42.18%&lt;/td&gt;
&lt;td&gt;11.22%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Koban Flip, ×1.96&lt;/td&gt;
&lt;td&gt;2.00%&lt;/td&gt;
&lt;td&gt;37.63%&lt;/td&gt;
&lt;td&gt;1.51%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chinchiro (97.38% return)&lt;/td&gt;
&lt;td&gt;2.62%&lt;/td&gt;
&lt;td&gt;37.28%&lt;/td&gt;
&lt;td&gt;0.55%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sic Bo Big / Small, ×2&lt;/td&gt;
&lt;td&gt;2.78%&lt;/td&gt;
&lt;td&gt;36.53%&lt;/td&gt;
&lt;td&gt;0.41%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Chinchiro’s payouts are not all even money (×3, ×4, ×6 for specials); it is modelled here as an even-money bet with the same return, which is slightly pessimistic for the long-shot payouts and does not change the picture.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At $10 a bet the games are a few points apart. At $1 a bet a 1% game gives you one chance in nine and a 2.8% game one in 240. The difference between a 1% and a 2.8% edge looks like 1.8 points on a payout table; over a session of a thousand bets it is the difference between a long shot and no shot. This is also why the question “which game has the lowest edge?” matters far more to a small-stakes player than to someone making one bet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The odds change the answer
&lt;/h2&gt;

&lt;p&gt;Everything above is even money. Dice lets you pick the odds at the same 1% edge, and that changes the doubling chance in a way most players would not guess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dice at a 1% edge: doubling $100 at different odds&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TARGET&lt;/th&gt;
&lt;th&gt;WIN CHANCE&lt;/th&gt;
&lt;th&gt;PAYS&lt;/th&gt;
&lt;th&gt;$10 A BET&lt;/th&gt;
&lt;th&gt;$1 A BET&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Over 50.00&lt;/td&gt;
&lt;td&gt;49.995%&lt;/td&gt;
&lt;td&gt;×1.98&lt;/td&gt;
&lt;td&gt;42.18%&lt;/td&gt;
&lt;td&gt;11.22%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Over 66.67&lt;/td&gt;
&lt;td&gt;33.32%&lt;/td&gt;
&lt;td&gt;×2.97&lt;/td&gt;
&lt;td&gt;43.47%&lt;/td&gt;
&lt;td&gt;25.86%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Over 90.00&lt;/td&gt;
&lt;td&gt;9.99%&lt;/td&gt;
&lt;td&gt;×9.90&lt;/td&gt;
&lt;td&gt;40.76%&lt;/td&gt;
&lt;td&gt;42.93%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Over 99.00&lt;/td&gt;
&lt;td&gt;0.99%&lt;/td&gt;
&lt;td&gt;×100.00&lt;/td&gt;
&lt;td&gt;9.54%&lt;/td&gt;
&lt;td&gt;41.47%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Replayed with the engine’s multipliers; at $1 a bet the 1% target reaches $200 with two hits (the second one landing before 100 straight misses) and busts after 100 misses in a row.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At $1 a bet the coin flip doubles you 11% of the time and the 1-in-100 shot 41% of the time — nearly four times as often, at the same edge. The reason is the same toll: a long shot settles the question in far fewer bets, so the house collects its 1% far fewer times before you are at $200 or $0. At $10 a bet the order flips, because ten misses at ×100 is a bust before the first hit is likely.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;None of this moves the average. Every row of every table returns 99 cents per dollar wagered; the long shot only changes how the loss is distributed — many sessions that end at $0 and a few that end at $200, instead of a slow grind to the same place. If the goal is “double or nothing”, the long shot is the better tool. If the goal is time at the table, it is the worst.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;p&gt;It is not a strategy. There is no stake, odds or game in these tables that reaches 50%, because the edge is paid on every bet and no sequence of bets avoids it — &lt;a href="https://betkyo.com/en/blog/the-martingale-priced-doubling-on-a-single-zero-wheel/" rel="noopener noreferrer"&gt;the martingale&lt;/a&gt; and its cousins only move the loss into a rare large one. What the tables do is make the trade visible: betting bigger buys a better chance of the target at the cost of a shorter session; betting a long shot buys the same thing at the cost of a wilder one.&lt;/p&gt;

&lt;p&gt;The honest use of the numbers is to pick the session you actually want before it starts. A player who wants an hour of play at $1 should know that the hour is the product and $200 is not; a player who wants to double should know that one bet at 49.995% to $198 is the best price on the board and anything slower is paying for the privilege of waiting. Our &lt;a href="https://betkyo.com/en/blog/risk-of-ruin/" rel="noopener noreferrer"&gt;risk of ruin&lt;/a&gt; piece covers the same trade in prose; this one puts the figures on it, game by game, from the engines that pay them.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What are the odds of doubling $100 at a casino?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At a 1% edge on dice (×1.98 at 50%): one all-in bet reaches $198 49.995% of the time; betting to $200 at a fixed stake, 42% at $10 a bet, 11% at $1, 1.6% at 50 cents. The edge is paid per bet, so the more bets the session takes, the lower the chance. At a 2.6–2.8% edge the $1-a-bet chance falls below 1%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it better to bet big or small to double my money?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To reach a target, bigger: one bet at 49.995% beats any sequence of smaller bets at the same edge, because every extra bet pays the house again. Smaller bets buy time at the table, not a better chance of the target.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do long-shot bets give a better chance of doubling?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At small stakes, yes. On dice at $1 a bet from $100, a 1-in-100 target at ×100 doubles you 41% of the time against 11% for the 50% target, because it settles in far fewer bets. At $10 a bet the order reverses. The average return is 99% either way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many bets does a session take?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On dice at 50% with $100: one bet all in, about 100 bets at $10, about 7,600 at $1 and about 19,000 at 50 cents before the bankroll reaches $200 or can no longer cover a bet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which game gives the best chance of doubling?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The lowest edge at the stake you intend to use: our 1% games (dice, limbo) ahead of Koban Flip at 2%, Chinchiro at 2.6% and Sic Bo Big/Small at 2.8%. At $1 a bet the gap is one chance in nine against one in 240.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Betkyo engine sources for the win chances and multipliers: OriginalBaseDiceService.kt (9,999 results; multiplier = (1 − edge) ÷ chance floored to 2dp), Koban Flip (×1.96), SicboEngine.kt (Big/Small ×2 on 105 of 216 rolls), ChinchiroDerivation.kt (97.38% return)&lt;/li&gt;
&lt;li&gt;Calculation written for this article: 200,000 replayed sessions per cell with the engine’s exact win chances and multipliers (win +stake × (multiplier − 1), loss −stake; stop at ≥ $200 or when the next bet cannot be placed), giving the doubling chance to ±0.1 point and the mean session length; the even-money gambler’s-ruin closed form for the fair coin and the Chinchiro model (Sic Bo: closed form 36.45% / 0.38% vs replay 36.53% / 0.41%)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>math</category>
      <category>probability</category>
      <category>statistics</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>The price of an hour: what each casino game costs per hour at your stake and pace</title>
      <dc:creator>Betkyo Research</dc:creator>
      <pubDate>Mon, 12 Oct 2026 07:34:45 +0000</pubDate>
      <link>https://dev.to/betkyo/the-price-of-an-hour-what-each-casino-game-costs-per-hour-at-your-stake-and-pace-4ppk</link>
      <guid>https://dev.to/betkyo/the-price-of-an-hour-what-each-casino-game-costs-per-hour-at-your-stake-and-pace-4ppk</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://betkyo.com/en/blog/the-price-of-an-hour-what-each-game-costs-per-hour-at-your-stake-and-pace/" rel="noopener noreferrer"&gt;Betkyo Journal&lt;/a&gt;. Drafted with AI assistance; every figure was checked against the game engine source and approved by a human editor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A house edge is a price per bet. Multiply it by your stake and by how many bets an hour you make and you get the only number that compares games honestly: dollars per hour. At $10 a bet, a 1% game at a steady pace costs about the same as a coffee; the same stake on Double costs a dinner. Here is the table, with the communal games’ round timers read from the engines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In short:&lt;/strong&gt; Expected cost per hour = &lt;strong&gt;stake × bets per hour × house edge&lt;/strong&gt;. Per 100 bets of $10 that is &lt;strong&gt;$10 on dice, limbo, plinko, hi-lo and crash targets (1%)&lt;/strong&gt;, &lt;strong&gt;$10.60 on baccarat Banker&lt;/strong&gt;, &lt;strong&gt;$15 on RPS&lt;/strong&gt;, &lt;strong&gt;$20 on Koban Flip&lt;/strong&gt;, &lt;strong&gt;$26–28 on Chinchiro, roulette and Sic Bo Big/Small&lt;/strong&gt;, &lt;strong&gt;$33–42 on the slots&lt;/strong&gt; (Bingo, Tairyō, Hanabi) and &lt;strong&gt;$67 on Double&lt;/strong&gt;. The communal games set the pace for you: a Crash round averages &lt;strong&gt;28 s&lt;/strong&gt; (10 s betting, ~14 s flight, 3 s break), so $10 a round costs about &lt;strong&gt;$13 an hour&lt;/strong&gt;; Wheel runs ~183 spins an hour (&lt;strong&gt;$19&lt;/strong&gt;), a Dragon Road seat ~141 hands (&lt;strong&gt;$16&lt;/strong&gt;), and Double ~193 spins — &lt;strong&gt;$128 an hour&lt;/strong&gt; at the same stake, because its 6.67% edge is paid every 19 seconds. Self-paced games cost whatever pace you set: dice at one bet every four seconds is 900 bets an hour, &lt;strong&gt;$90 an hour at $10&lt;/strong&gt; and &lt;strong&gt;$9 at $1&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A price per bet is not a price
&lt;/h2&gt;

&lt;p&gt;Every game on this site publishes its house edge, and we have spent a month computing them exactly. But an edge is a price per bet, and nobody plays one bet. What a session costs depends on three things — the edge, the stake and the number of bets — and the third one is where the games differ most. A 1% edge paid 900 times an hour is a bigger bill than a 2.7% edge paid 100 times. This article puts the three together.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Engine-verified.&lt;/strong&gt; Edges are the exact figures from the game articles in this series (dice, limbo and crash targets 1.00%; wheel 1.04%; baccarat Banker 1.06%; Dragon Road Banker 1.16%; RPS 1.50% per decided round; Koban Flip 2.00%; Casino Hold’em about 2.2% of the ante; Chinchiro 2.616%; roulette 2.70%; Sic Bo Big/Small 2.78%; Bingo 3.34%; Tairyō about 3.7%; Hanabi 4.19%; Double 6.67%; blackjack basic strategy 0.57%). Round timers are read from the engines: CrashEngine.kt grows the multiplier as 2^(t ÷ 10 s) with a 10-second betting window, a 0.9-second lock and a 3-second intermission; DoubleEngine.kt 12 s betting + 0.7 s lock + 6 s result; WheelEngine.kt 10 s betting + 0.7 s lock + 9 s spin; SbacFleetEngine.kt 20 s betting + 1.5 s lock + 4 s result per table. The average Crash flight is E[ln bust] ÷ ln 2 × 10 s with P(bust &amp;gt; x) = 0.99 ÷ x, which is 0.99 ÷ 0.0693 ≈ 14.3 s.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Per hundred bets
&lt;/h2&gt;

&lt;p&gt;Start with the stake-and-edge part and leave pace out: what 100 bets of $10 cost on average, which is simply the edge times $1,000.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expected cost of 100 bets at $10&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;GAME&lt;/th&gt;
&lt;th&gt;HOUSE EDGE&lt;/th&gt;
&lt;th&gt;PER 100 BETS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Blackjack, basic strategy&lt;/td&gt;
&lt;td&gt;0.57%&lt;/td&gt;
&lt;td&gt;$5.70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dice · Limbo · Crash targets · Plinko · Hi-Lo · Pagoda (Hard)&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;$10.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wheel&lt;/td&gt;
&lt;td&gt;1.04%&lt;/td&gt;
&lt;td&gt;$10.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Baccarat, Banker&lt;/td&gt;
&lt;td&gt;1.06%&lt;/td&gt;
&lt;td&gt;$10.60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keno (all 40 tables)&lt;/td&gt;
&lt;td&gt;0.93–1.35%&lt;/td&gt;
&lt;td&gt;$9.30–13.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RPS (per decided round)&lt;/td&gt;
&lt;td&gt;1.50%&lt;/td&gt;
&lt;td&gt;$15.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Koban Flip&lt;/td&gt;
&lt;td&gt;2.00%&lt;/td&gt;
&lt;td&gt;$20.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Casino Hold’em (of the ante)&lt;/td&gt;
&lt;td&gt;≈2.2%&lt;/td&gt;
&lt;td&gt;≈$22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chinchiro&lt;/td&gt;
&lt;td&gt;2.62%&lt;/td&gt;
&lt;td&gt;$26.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roulette (single zero)&lt;/td&gt;
&lt;td&gt;2.70%&lt;/td&gt;
&lt;td&gt;$27.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video poker 8/5, best hold&lt;/td&gt;
&lt;td&gt;2.70%&lt;/td&gt;
&lt;td&gt;$27.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sic Bo, Big / Small&lt;/td&gt;
&lt;td&gt;2.78%&lt;/td&gt;
&lt;td&gt;$27.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bingo&lt;/td&gt;
&lt;td&gt;3.34%&lt;/td&gt;
&lt;td&gt;$33.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tairyō&lt;/td&gt;
&lt;td&gt;≈3.7%&lt;/td&gt;
&lt;td&gt;≈$37&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hanabi&lt;/td&gt;
&lt;td&gt;4.19%&lt;/td&gt;
&lt;td&gt;$41.90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Double, any colour&lt;/td&gt;
&lt;td&gt;6.67%&lt;/td&gt;
&lt;td&gt;$66.70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Mines runs 1.0–2.5% depending on the rung (small multipliers cost more); dice between its round targets runs up to 1.97%. Expected cost is the average over many sessions — any one hour can land far from it, which is the subject of the risk-of-ruin and doubling pieces.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read down the column and the games sort into four groups: the 1% originals and blackjack, the 1.5–2% streak games, the 2.6–2.8% table classics, and the 3–7% slots and Double. The gap between the top and bottom of the table is a factor of twelve at the same stake. That gap is the whole point of knowing the edge — and it is still only half the price.&lt;/p&gt;

&lt;h2&gt;
  
  
  The communal games set the pace
&lt;/h2&gt;

&lt;p&gt;Four games run on the house’s clock, not yours: Crash, Wheel, Double and Dragon Road. Their round lengths are constants in the engines, so their hourly cost at a flat stake is fixed too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Communal games: round length and cost per hour at $10 a round&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;GAME&lt;/th&gt;
&lt;th&gt;ROUND&lt;/th&gt;
&lt;th&gt;ROUNDS / HOUR&lt;/th&gt;
&lt;th&gt;EDGE&lt;/th&gt;
&lt;th&gt;COST / HOUR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Crash&lt;/td&gt;
&lt;td&gt;10 s betting + 0.9 s lock + ~14.3 s flight + 3 s break ≈ 28 s&lt;/td&gt;
&lt;td&gt;≈128&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;≈$13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dragon Road (one table)&lt;/td&gt;
&lt;td&gt;20 s betting + 1.5 s lock + 4 s result = 25.5 s&lt;/td&gt;
&lt;td&gt;≈141&lt;/td&gt;
&lt;td&gt;1.16% (Banker)&lt;/td&gt;
&lt;td&gt;≈$16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wheel&lt;/td&gt;
&lt;td&gt;10 s betting + 0.7 s lock + 9 s spin = 19.7 s&lt;/td&gt;
&lt;td&gt;≈183&lt;/td&gt;
&lt;td&gt;1.04%&lt;/td&gt;
&lt;td&gt;≈$19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Double&lt;/td&gt;
&lt;td&gt;12 s betting + 0.7 s lock + 6 s result = 18.7 s&lt;/td&gt;
&lt;td&gt;≈193&lt;/td&gt;
&lt;td&gt;6.67%&lt;/td&gt;
&lt;td&gt;≈$128&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Crash’s flight is the only variable: the multiplier doubles every 10 seconds and the round busts at a point with P(bust &amp;gt; x) = 0.99 ÷ x, so the average flight is ≈14.3 s; one round in a hundred busts instantly. Dragon Road Player is 1.37%, Tie 14.3%.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Double is the outlier and worth saying plainly: at $10 a spin it costs about ten times what Crash costs at $10 a round, because it has six times the edge and runs half again as fast. Nothing about that is hidden — both numbers are printed — but neither is printed as dollars per hour, and that is the figure that matters to a wallet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The self-paced games cost what you set
&lt;/h2&gt;

&lt;p&gt;Dice, limbo, plinko, mines, keno, the card games and the slots have no round timer; the pace is yours. The arithmetic is the same — stake × bets per hour × edge — and the pace term is the one that moves most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dice at a 50% target (1% edge): cost per hour by stake and pace&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PACE&lt;/th&gt;
&lt;th&gt;BETS / HOUR&lt;/th&gt;
&lt;th&gt;$1 A BET&lt;/th&gt;
&lt;th&gt;$10 A BET&lt;/th&gt;
&lt;th&gt;$100 A BET&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One bet every 30 s&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;$1.20&lt;/td&gt;
&lt;td&gt;$12&lt;/td&gt;
&lt;td&gt;$120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One bet every 10 s&lt;/td&gt;
&lt;td&gt;360&lt;/td&gt;
&lt;td&gt;$3.60&lt;/td&gt;
&lt;td&gt;$36&lt;/td&gt;
&lt;td&gt;$360&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One bet every 4 s&lt;/td&gt;
&lt;td&gt;900&lt;/td&gt;
&lt;td&gt;$9.00&lt;/td&gt;
&lt;td&gt;$90&lt;/td&gt;
&lt;td&gt;$900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-bet, one per second&lt;/td&gt;
&lt;td&gt;3,600&lt;/td&gt;
&lt;td&gt;$36&lt;/td&gt;
&lt;td&gt;$360&lt;/td&gt;
&lt;td&gt;$3,600&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Multiply any cell by the edge ratio for another game: ×2.7 for roulette, ×4.19 for Hanabi, ×6.67 for Double. Auto-bet at $10 on Double would be about $2,400 an hour.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two things fall out of the table. First, pace is a bigger lever than game choice: moving from one bet every 10 seconds to auto-bet multiplies the hourly cost by ten, more than the gap between dice and Double. Second, the stake lever is linear and honest — $1 bets cost a tenth of $10 bets per hour — which is why &lt;a href="https://betkyo.com/en/blog/doubling-100-dollars-priced-the-chance-of-doubling-before-busting-at-every-stake-and-edge/" rel="noopener noreferrer"&gt;the doubling piece&lt;/a&gt; found the opposite about reaching a target: small bets are cheap per hour and expensive per goal.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do with the number
&lt;/h2&gt;

&lt;p&gt;Decide what an hour is worth to you before it starts, and pick the stake and pace that price it there. At $1 a bet and a relaxed pace, every game on the site costs less than $10 an hour in expectation; at $10 and auto-bet, none costs less than $36 and several cost hundreds. The games that feel the same — a chip on red, a chip on a colour in Double — are a factor of 2.5 apart per bet and nearly 4 apart per hour.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Expected cost is not a guarantee in either direction. In one hour the variance dwarfs the edge — on dice at 360 bets of $10 the standard deviation of the hour’s result is about $190 against an expected loss of $36 — which is exactly why the edge is easy to ignore and expensive to ignore. Over many hours the expectation is what you pay.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How much does an hour of casino play cost?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stake × bets per hour × house edge. At $10 a bet and 360 bets an hour: about $36 on a 1% game (dice, limbo, crash), $97 on roulette, $151 on Hanabi, $240 on Double. At $1 a bet, a tenth of that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which game is cheapest per hour?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Per bet, blackjack at basic strategy (0.57%) and the 1% originals. Per hour it depends on pace: the communal games are fixed — Crash about $13 an hour at $10 a round, Wheel $19, Dragon Road $16, Double $128 — and self-paced games cost whatever pace you set.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long is a Crash round?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;About 28 seconds on average: a 10-second betting window, a 0.9-second lock, a flight that averages 14.3 seconds (the multiplier doubles every 10 seconds; one round in 100 busts instantly) and a 3-second intermission. About 128 rounds an hour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is Double so much more expensive than Crash?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Six times the edge (6.67% against 1%) and a faster round (18.7 s against about 28 s). At $10 a round that is roughly $128 an hour against $13.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does betting slower change the house edge?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No — it changes how many times you pay it. The edge per bet is fixed; bets per hour is the lever. Halving the pace halves the expected hourly cost at the same stake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Betkyo engine sources: CrashEngine.kt (GROWTH_R = ln 2 ÷ 10; betting-seconds 10; lock-ms 900; intermission-seconds 3), DoubleEngine.kt (betting-seconds 12; lock-ms 700; result-seconds 6), WheelEngine.kt (betting-seconds 10; lock-ms 700; spin-seconds 9), SbacFleetEngine.kt (bettingMs 20,000; lockMs 1,500; resultMs 4,000)&lt;/li&gt;
&lt;li&gt;House edges: the exact figures computed in this series’ game articles (dice, limbo, crash, wheel, plinko, hi-lo, pagoda, keno, RPS, Koban Flip, Chinchiro, roulette, Sic Bo, baccarat, Casino Hold’em, video poker, blackjack, Bingo, Tairyō, Hanabi, Double, Dragon Road); Crash average flight = E[ln bust] ÷ r with P(bust &amp;gt; x) = 0.99 ÷ x on [1, 9,999.99]&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>math</category>
      <category>probability</category>
      <category>statistics</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Dice, priced exactly: the true win chance and return behind every target</title>
      <dc:creator>Betkyo Research</dc:creator>
      <pubDate>Mon, 28 Sep 2026 03:42:46 +0000</pubDate>
      <link>https://dev.to/betkyo/dice-priced-exactly-the-true-win-chance-and-return-behind-every-target-abl</link>
      <guid>https://dev.to/betkyo/dice-priced-exactly-the-true-win-chance-and-return-behind-every-target-abl</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published in the &lt;a href="https://betkyo.com/en/blog/dice-odds-priced-the-true-win-chance-and-return-behind-every-target/" rel="noopener noreferrer"&gt;Betkyo Journal&lt;/a&gt;. Drafted with AI assistance; every figure was checked against the game engine source and approved by a human editor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A dice screen shows two numbers, a win chance and a multiplier, and multiplying them gives 99% — at some targets. The roll has 9,999 possible results, not 10,000, and the multiplier is cut to two decimals, so the real return moves between 98.03% and 99.00% depending on where the target sits. Here is the exact price of every setting, and the one habit that avoids nearly all of the difference.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick answer:&lt;/strong&gt; Each roll is one of &lt;strong&gt;9,999 equally likely results, 0.01 to 99.99&lt;/strong&gt;. Roll under 50 wins on 4,999 of them, so the true chance is &lt;strong&gt;49.995%&lt;/strong&gt;, not 50%, and a result of exactly 50.00 loses both Under and Over. The multiplier is 0.99 ÷ the shown chance &lt;strong&gt;floored to two decimals&lt;/strong&gt;. Where that division lands exactly, as at 50 (×1.98), 25 (×3.96) or 10 (×9.90), the true return is &lt;strong&gt;98.91–99.00%&lt;/strong&gt;; where it does not, the floor adds cost — &lt;strong&gt;target 80 pays ×1.23 and returns 98.40%&lt;/strong&gt;, and &lt;strong&gt;97.06 pays ×1.01 and returns 98.03%&lt;/strong&gt;, the worst setting on the slider. Across all 9,601 slider positions from 2.00 to 98.00 the average return is &lt;strong&gt;98.72%&lt;/strong&gt;. &lt;strong&gt;Typing the multiplier instead of dragging the slider&lt;/strong&gt; picks the target that prices cleanly: ×2 returns &lt;strong&gt;98.99%&lt;/strong&gt;, ×10 &lt;strong&gt;98.91%&lt;/strong&gt;, ×49.5 &lt;strong&gt;98.51%&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  One roll, 9,999 results
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://betkyo.com/en/dice/" rel="noopener noreferrer"&gt;Dice&lt;/a&gt; is the simplest game on the site: choose a target, choose Under or Over, and the roll either lands on your side of it or does not. The screen quotes a win chance and a multiplier for every target, and the two look like they multiply to exactly 99% — the stake back, less a 1% house edge. The engine is a little more particular than the screen, in two ways that both cost the player, and this article prices them exactly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Verified in the engine:&lt;/strong&gt; OriginalBaseDiceService.kt: getResult() draws nextIntBelow(9999) + 1 and divides by 100, so the result is one of the 9,999 values 0.01 to 99.99 — 0.00 excluded, 99.99 included. getWinChance() is target ÷ 100 for Under and (100 − target) ÷ 100 for Over. checkAndGetMultiplier() is (1 − house edge) ÷ win chance, floored to two decimals. getEarned() compares strictly: Under wins when the result is below the target, Over when it is above. The random number is the first 13 hex digits of HMAC-SHA256 over “clientSeed-nonce-0”, keyed by the server seed, divided by 2⁵²; the client mirror is payoutMultiplier() in dice/diceApi.ts, and diceGame.tsx limits the slider to targets 2.00–98.00.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The house service carries its own test of this arithmetic, DiceHouseEdgeTest, which checks that no target ever returns more than 99% and that the floor never takes more than one rounding step. Both hold. What the test does not print is how much each target actually returns, and that is the table a player needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shown chance and the true chance
&lt;/h2&gt;

&lt;p&gt;The win chance on screen is computed as if the roll were a continuous number from 0 to 100. It is not: it is one of 9,999 steps. Roll under a target T wins on the results 0.01 up to T − 0.01, which is 100 × T − 1 of them, so the true chance is (100T − 1) ÷ 9,999. At most targets the difference is invisible; at the smallest ones it is not.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Roll under a target: winning results, shown chance and true chance&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TARGET (UNDER)&lt;/th&gt;
&lt;th&gt;WINNING RESULTS OF 9,999&lt;/th&gt;
&lt;th&gt;SHOWN CHANCE&lt;/th&gt;
&lt;th&gt;TRUE CHANCE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;td&gt;199&lt;/td&gt;
&lt;td&gt;2.00%&lt;/td&gt;
&lt;td&gt;1.9902%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.00&lt;/td&gt;
&lt;td&gt;499&lt;/td&gt;
&lt;td&gt;5.00%&lt;/td&gt;
&lt;td&gt;4.9905%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.00&lt;/td&gt;
&lt;td&gt;999&lt;/td&gt;
&lt;td&gt;10.00%&lt;/td&gt;
&lt;td&gt;9.9910%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25.00&lt;/td&gt;
&lt;td&gt;2,499&lt;/td&gt;
&lt;td&gt;25.00%&lt;/td&gt;
&lt;td&gt;24.9925%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50.00&lt;/td&gt;
&lt;td&gt;4,999&lt;/td&gt;
&lt;td&gt;50.00%&lt;/td&gt;
&lt;td&gt;49.9950%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75.00&lt;/td&gt;
&lt;td&gt;7,499&lt;/td&gt;
&lt;td&gt;75.00%&lt;/td&gt;
&lt;td&gt;74.9975%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90.00&lt;/td&gt;
&lt;td&gt;8,999&lt;/td&gt;
&lt;td&gt;90.00%&lt;/td&gt;
&lt;td&gt;89.9990%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;98.00&lt;/td&gt;
&lt;td&gt;9,799&lt;/td&gt;
&lt;td&gt;98.00%&lt;/td&gt;
&lt;td&gt;97.9998%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;True chance = (100 × target − 1) ÷ 9,999. Roll over a target T wins on 9,999 − 100T results, so Over T is priced exactly like Under (100 − T): Over 50 also wins on 4,999 results.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The gap is always one result. At a 50% target it costs 0.005 percentage points of chance, a hundredth of a percent of return; at the 2% target, the tightest the slider allows, one result out of 200 is about half a percent of the win chance, and the return drops from 99.00% to 98.51% for that reason alone. The same fact explains a small curiosity: a roll of exactly 50.00 loses Under 50 and Over 50 alike, because neither comparison includes the target. It happens once in 9,999 rolls.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two-decimal floor
&lt;/h2&gt;

&lt;p&gt;The second cost is the multiplier. The engine divides 0.99 by the win chance and keeps two decimals, always rounding down. When the division comes out exact — 0.99 ÷ 0.50 = 1.98, 0.99 ÷ 0.25 = 3.96 — nothing is lost. When it does not, the player is paid the truncated figure: 0.99 ÷ 0.80 = 1.2375, paid as ×1.23. At a high win chance the multiplier is close to 1, the hundredth that gets dropped is a large share of the profit, and the return falls much further than at the low end.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What a roll-under target pays and returns, 1% house edge&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TARGET (UNDER)&lt;/th&gt;
&lt;th&gt;PAYS&lt;/th&gt;
&lt;th&gt;SHOWN CHANCE × PAYS&lt;/th&gt;
&lt;th&gt;TRUE RETURN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;td&gt;×49.50&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;98.51%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.00&lt;/td&gt;
&lt;td&gt;×19.80&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;98.81%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.00&lt;/td&gt;
&lt;td&gt;×14.14&lt;/td&gt;
&lt;td&gt;98.98%&lt;/td&gt;
&lt;td&gt;98.85%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.00&lt;/td&gt;
&lt;td&gt;×9.90&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;98.91%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13.00&lt;/td&gt;
&lt;td&gt;×7.61&lt;/td&gt;
&lt;td&gt;98.93%&lt;/td&gt;
&lt;td&gt;98.86%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25.00&lt;/td&gt;
&lt;td&gt;×3.96&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;98.97%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40.00&lt;/td&gt;
&lt;td&gt;×2.47&lt;/td&gt;
&lt;td&gt;98.80%&lt;/td&gt;
&lt;td&gt;98.79%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50.00&lt;/td&gt;
&lt;td&gt;×1.98&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;98.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70.00&lt;/td&gt;
&lt;td&gt;×1.41&lt;/td&gt;
&lt;td&gt;98.70%&lt;/td&gt;
&lt;td&gt;98.70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;80.00&lt;/td&gt;
&lt;td&gt;×1.23&lt;/td&gt;
&lt;td&gt;98.40%&lt;/td&gt;
&lt;td&gt;98.40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90.00&lt;/td&gt;
&lt;td&gt;×1.10&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;95.00&lt;/td&gt;
&lt;td&gt;×1.04&lt;/td&gt;
&lt;td&gt;98.80%&lt;/td&gt;
&lt;td&gt;98.80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;97.06&lt;/td&gt;
&lt;td&gt;×1.01&lt;/td&gt;
&lt;td&gt;98.03%&lt;/td&gt;
&lt;td&gt;98.03%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;98.00&lt;/td&gt;
&lt;td&gt;×1.01&lt;/td&gt;
&lt;td&gt;98.98%&lt;/td&gt;
&lt;td&gt;98.98%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;True return = multiplier × (100 × target − 1) ÷ 9,999. At 90.00 it is 98.999%, the highest on the slider; at 97.06 it is 98.030%, the lowest. Over targets mirror these rows: Over T returns what Under (100 − T) returns.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read the two right-hand columns together and the two costs separate cleanly. At low targets the multiplier usually divides exactly and the whole shortfall is the missing result; at high targets the missing result is negligible and the shortfall is almost all floor. Target 80 is the clearest case: 0.99 ÷ 0.8 needs ×1.2375, the table pays ×1.23, and the return is 98.40% — a house edge of 1.6%, not 1%. Every target between 97.06 and 98.00 pays the same ×1.01, so the chance you give up by moving to 97.06 buys nothing.&lt;/p&gt;

&lt;p&gt;Over the whole slider — every target from 2.00 to 98.00 in steps of 0.01, 9,601 settings — the true return averages 98.72%. Only 585 of those settings, 6.1%, return 98.95% or more; 1,453, 15.1%, return less than 98.50%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Type the multiplier, not the percentage
&lt;/h2&gt;

&lt;p&gt;The game has a second way to set a bet: type the multiplier you want, and it works out the target. It chooses the target whose floored payout is at least what you typed, so a typed multiplier always lands on a setting where 0.99 ÷ chance divides cleanly. That removes the floor cost entirely; only the one-result gap remains.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Typed multipliers and the targets they resolve to&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TYPED&lt;/th&gt;
&lt;th&gt;TARGET (UNDER)&lt;/th&gt;
&lt;th&gt;TRUE CHANCE&lt;/th&gt;
&lt;th&gt;TRUE RETURN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;×1.10&lt;/td&gt;
&lt;td&gt;90.00&lt;/td&gt;
&lt;td&gt;89.9990%&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.20&lt;/td&gt;
&lt;td&gt;82.50&lt;/td&gt;
&lt;td&gt;82.4982%&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.50&lt;/td&gt;
&lt;td&gt;66.00&lt;/td&gt;
&lt;td&gt;65.9966%&lt;/td&gt;
&lt;td&gt;98.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×2&lt;/td&gt;
&lt;td&gt;49.50&lt;/td&gt;
&lt;td&gt;49.4949%&lt;/td&gt;
&lt;td&gt;98.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×3&lt;/td&gt;
&lt;td&gt;33.00&lt;/td&gt;
&lt;td&gt;32.9933%&lt;/td&gt;
&lt;td&gt;98.98%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×5&lt;/td&gt;
&lt;td&gt;19.80&lt;/td&gt;
&lt;td&gt;19.7920%&lt;/td&gt;
&lt;td&gt;98.96%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10&lt;/td&gt;
&lt;td&gt;9.90&lt;/td&gt;
&lt;td&gt;9.8910%&lt;/td&gt;
&lt;td&gt;98.91%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×20&lt;/td&gt;
&lt;td&gt;4.95&lt;/td&gt;
&lt;td&gt;4.9405%&lt;/td&gt;
&lt;td&gt;98.81%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×49.50&lt;/td&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;td&gt;1.9902%&lt;/td&gt;
&lt;td&gt;98.51%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;targetForMultiplier() in dice/diceApi.ts floors the Under target (or ceils the Over target) so the chance never rises above the one the typed multiplier implies. Returns rounded to two decimals; ×1.10 is 98.999% and ×1.20 98.998%.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The practical rule is short. If you care about the last half-point, set the multiplier rather than the percentage, and prefer round multipliers at the low end of the payout range. A target chosen because it looks round as a percentage — 80, 70, 40 — is often a worse price than the target one tick away. None of this changes the long-run direction: every setting returns less than the stake, and &lt;a href="https://betkyo.com/en/blog/the-martingale-priced-doubling-on-a-single-zero-wheel/" rel="noopener noreferrer"&gt;the martingale, priced&lt;/a&gt; and &lt;a href="https://betkyo.com/en/blog/risk-of-ruin/" rel="noopener noreferrer"&gt;risk of ruin&lt;/a&gt; explain why no sequence of bets fixes that.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://betkyo.com/en/blog/limbo-odds-priced-the-win-chance-behind-every-target-multiplier/" rel="noopener noreferrer"&gt;Limbo&lt;/a&gt; avoids the floor by construction: the player names the payout directly and the drawn number is compared against that same figure, so there is no second rounding to pay for. Dice quotes a chance and derives the payout from it, and that derivation is where the floor enters.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Checking a roll yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Before you play, the fairness panel shows the SHA-256 fingerprint of the server seed. Rotate your seed pair afterwards to reveal the seed and confirm the fingerprint.&lt;/li&gt;
&lt;li&gt;Compute HMAC-SHA256 with the server seed as the key and “clientSeed-nonce-0” as the message; a roll uses cursor 0 only.&lt;/li&gt;
&lt;li&gt;Read the first 13 hex digits of the digest as an integer and divide by 2⁵² to get u. The result is (floor(u × 9,999) + 1) ÷ 100. Compare it with your target, strictly, and the multiplier on your ticket with 0.99 ÷ chance floored to two decimals.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the result matches, it was fixed before you chose a target — which, as &lt;a href="https://betkyo.com/en/blog/what-a-hash-commitment-proves/" rel="noopener noreferrer"&gt;what a hash commitment proves&lt;/a&gt; explains, is what the commitment guarantees and all it guarantees. The price of the target is not in the hash. It is in the two lines of arithmetic above, which is why this article exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What are the real odds in a dice game that rolls 0 to 100?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here the roll is one of 9,999 results from 0.01 to 99.99. Roll under T wins on 100 × T − 1 of them, so roll under 50 is 49.995%, roll under 10 is 9.991% and roll under 2 is 1.990%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the house edge on dice?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The stated edge is 1%, but the true return depends on the target: from 99.00% at a target of 90 to 98.03% at 97.06. Averaged over every slider setting from 2.00 to 98.00 it is 98.72%, an effective edge of 1.28%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does my dice multiplier look rounded down?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The engine pays 0.99 ÷ win chance floored to two decimals. At an 80% target that is 1.2375, paid as ×1.23, which returns 98.40% instead of 99%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the best target to pick in dice?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Any target where 0.99 ÷ chance divides exactly, such as 50 (×1.98), 25 (×3.96), 90 (×1.10) or 66 (×1.50). Typing the multiplier instead of the percentage finds one automatically. No target returns more than 99%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens if the dice roll lands exactly on my target?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It loses. Under wins only below the target and Over only above it, so a roll of exactly 50.00 loses both Under 50 and Over 50. It happens once in 9,999 rolls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I verify a dice roll?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. HMAC-SHA256 of “clientSeed-nonce-0” keyed by the revealed server seed; the first 13 hex digits over 2⁵² give u, and (floor(u × 9,999) + 1) ÷ 100 is the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Betkyo engine source, house service: OriginalBaseDiceService.kt — getResult() (nextIntBelow(9999) + 1, over 100), getWinChance() (4-decimal floor), checkAndGetMultiplier() ((1 − house edge) ÷ win chance, 2-decimal floor), getEarned() (strict comparison); SeedPairRandom and PfHashUtils.normalize() (first 13 hex digits ÷ 2⁵²); DiceHouseEdgeTest.kt&lt;/li&gt;
&lt;li&gt;Betkyo engine source, client mirror: payoutMultiplier() and targetForMultiplier() in dice/diceApi.ts; the 2.00–98.00 slider bounds in diceGame.tsx&lt;/li&gt;
&lt;li&gt;Exact calculation written for this article: (100T − 1) ÷ 9,999 win chances and floored multipliers for all 9,601 slider targets, their true returns and distribution; cross-checked by replaying 400,000 rolls of the HMAC stream through the result derivation (roll under 50: 49.88% simulated vs 49.995% exact; results spanned 0.01 to 99.99)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>math</category>
      <category>probability</category>
      <category>statistics</category>
    </item>
    <item>
      <title>Roulette hit rates, priced: how long a number takes and what a streak is worth</title>
      <dc:creator>Betkyo Research</dc:creator>
      <pubDate>Wed, 23 Sep 2026 02:35:36 +0000</pubDate>
      <link>https://dev.to/betkyo/roulette-hit-rates-priced-how-long-a-number-takes-and-what-a-streak-is-worth-3lao</link>
      <guid>https://dev.to/betkyo/roulette-hit-rates-priced-how-long-a-number-takes-and-what-a-streak-is-worth-3lao</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published in the &lt;a href="https://betkyo.com/en/blog/roulette-hit-rates-priced-how-long-a-number-takes-and-what-a-streak-is-worth/" rel="noopener noreferrer"&gt;Betkyo Journal&lt;/a&gt;. Drafted with AI assistance; every figure was checked against the game engine source and approved by a human editor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Every bet on this single-zero wheel costs the same 2.7%, so the interesting questions are the ones the price does not answer: how many spins a number usually takes, how often a colour runs eight deep, how long zero can stay away, and how far a session can drift from its expected loss. Here are the answers, computed from the engine’s 37 pockets.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick answer:&lt;/strong&gt; On this engine’s European roulette every pocket lands &lt;strong&gt;1 in 37&lt;/strong&gt; per spin. A straight-up number takes &lt;strong&gt;37 spins on average but only 26 to have a 50% chance of appearing&lt;/strong&gt;; it is absent from &lt;strong&gt;100 spins 6.5% of the time&lt;/strong&gt; and from 200 spins 0.4%. Red comes up &lt;strong&gt;five times in a row 2.7%&lt;/strong&gt; of the time and &lt;strong&gt;ten times in a row 0.07%&lt;/strong&gt;; an even-money bet loses &lt;strong&gt;eight in a row 0.48%&lt;/strong&gt;, roughly once every 207 spins. Zero has landed at least once in 37 spins &lt;strong&gt;63.7%&lt;/strong&gt; of the time — so it is absent from a full wheel’s worth of spins more than a third of the time. Every bet returns &lt;strong&gt;97.30%&lt;/strong&gt;, but the swing is not the same: over 100 one-unit spins the expected loss is 2.7 units on every bet, while the standard deviation is about &lt;strong&gt;10 units on red&lt;/strong&gt;, 14 on a dozen and &lt;strong&gt;58 on a straight-up number&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  One spin, thirty-seven pockets
&lt;/h2&gt;

&lt;p&gt;Roulette on this site is a single-zero wheel, and the whole of its arithmetic rests on one fact: each spin lands on one of 37 pockets with equal chance. &lt;a href="https://betkyo.com/en/blog/a-roulette-bet-is-a-string-self-describing-keys-and-the-36-table/" rel="noopener noreferrer"&gt;A roulette bet is a string&lt;/a&gt; walked through the consequence for price — every bet returns 36 ÷ 37 = 97.30%. This article is about everything the price leaves out: how long things take, how often they cluster, and how much a session can wander.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Verified in the engine:&lt;/strong&gt; deriveRouletteSpin() in roulette/derive.ts: the pocket is floor(u × 37) from cursor 0 of the round’s HMAC, u = hi ÷ 2³² + lo ÷ 2⁶⁴ (u64()); the server port RouletteEngine.derivePocket() uses U64SeedStream(...).intBelow(37). Settlement pays stake × multiplier per covering key (×36 straight, ×18 split, ×12 street, ×9 corner and first four, ×6 six line, ×3 dozen and column, ×2 even chances); the multipliers are whole numbers, so nothing is lost to rounding. One nonce settles the whole table in one spin.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two things follow from the derivation. Each spin is a fresh HMAC of a fresh nonce, so spins are independent: the wheel has no memory, and every figure below is a plain power or a binomial count. And the 37 pockets are equally likely to within one part in 2⁶⁴, so the physical wheel-bias stories from &lt;a href="https://betkyo.com/en/blog/wheel-bias-jagger-and-garcia-pelayo/" rel="noopener noreferrer"&gt;Jaggers and Garcia-Pelayo&lt;/a&gt; have no counterpart here: there is no worn fret to find.&lt;/p&gt;

&lt;h2&gt;
  
  
  How long a number takes
&lt;/h2&gt;

&lt;p&gt;A straight-up number wins 1 in 37 per spin, so the average wait between hits is 37 spins. Averages mislead on waiting times, because the distribution is lopsided: most gaps are shorter than 37 and a few are very long. The useful figures are the chances of seeing the number within a given stretch, which is 1 − (36 ÷ 37)ᴺ.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Chance that a chosen number lands at least once, betting it every spin&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SPINS&lt;/th&gt;
&lt;th&gt;AT LEAST ONE HIT&lt;/th&gt;
&lt;th&gt;NO HIT AT ALL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;23.97%&lt;/td&gt;
&lt;td&gt;76.03%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;50.95%&lt;/td&gt;
&lt;td&gt;49.05%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;63.71%&lt;/td&gt;
&lt;td&gt;36.29%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;74.59%&lt;/td&gt;
&lt;td&gt;25.41%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;93.54%&lt;/td&gt;
&lt;td&gt;6.46%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;98.36%&lt;/td&gt;
&lt;td&gt;1.64%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;99.58%&lt;/td&gt;
&lt;td&gt;0.42%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;99.97%&lt;/td&gt;
&lt;td&gt;0.03%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;No hit in N spins = (36 ÷ 37)ᴺ. The median wait is 26 spins, the first N at which the chance of a hit passes one half; the mean is 37. In 37 spins the number lands exactly once 37.3% of the time and two or more times 26.4%.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The row that surprises people is the third one: play your number for a full wheel’s worth of spins, 37 of them, and more than a third of the time it never comes. That is not bad luck; it is the ordinary shape of a 1-in-37 event. A hundred spins leaves a 6.5% chance of an empty run, one session in fifteen, and each of those sessions costs 100 units for nothing back.&lt;/p&gt;

&lt;p&gt;The same table describes zero, which is just another pocket. Zero lands at least once in 37 spins 63.7% of the time, in 74 spins 86.8%, in 10 spins 24.0%. A table that has not shown zero for fifty spins is not “due” — the next spin is 1 ÷ 37 exactly as it was — and a table that showed it twice in ten is not “hot”. &lt;a href="https://betkyo.com/en/blog/gamblers-fallacy/" rel="noopener noreferrer"&gt;The gambler’s fallacy&lt;/a&gt; is the belief that the wheel keeps a ledger; the hash does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a streak is worth
&lt;/h2&gt;

&lt;p&gt;Colour runs are the streaks players remember, and on a single-zero wheel they are less rare than they feel. Red wins 18 ÷ 37 of spins; the chance of k reds in a row is (18 ÷ 37)ᵏ. The losing side of an even-money bet is 19 ÷ 37, because zero counts against it, so losing runs are slightly likelier than winning ones of the same length.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Runs on an even-money bet, single-zero wheel&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;RUN LENGTH&lt;/th&gt;
&lt;th&gt;SAME COLOUR (WIN) RUN&lt;/th&gt;
&lt;th&gt;LOSING RUN (INCL. ZERO)&lt;/th&gt;
&lt;th&gt;A LOSING RUN THIS LONG STARTS ABOUT ONCE IN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;11.51%&lt;/td&gt;
&lt;td&gt;13.54%&lt;/td&gt;
&lt;td&gt;15 spins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2.72%&lt;/td&gt;
&lt;td&gt;3.57%&lt;/td&gt;
&lt;td&gt;58 spins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;0.31%&lt;/td&gt;
&lt;td&gt;0.48%&lt;/td&gt;
&lt;td&gt;425 spins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;0.074%&lt;/td&gt;
&lt;td&gt;0.128%&lt;/td&gt;
&lt;td&gt;1,610 spins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;0.009%&lt;/td&gt;
&lt;td&gt;0.017%&lt;/td&gt;
&lt;td&gt;12,000 spins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;0.002%&lt;/td&gt;
&lt;td&gt;0.005%&lt;/td&gt;
&lt;td&gt;45,000 spins&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Win run = (18 ÷ 37)ᵏ, losing run = (19 ÷ 37)ᵏ. The last column is 1 ÷ ((19 ÷ 37)ᵏ × (18 ÷ 37)), the average spacing between the starts of losing runs of at least k. A dozen or column misses five times in a row 14.1% of the time and ten times 1.98%.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eight losses in a row is the number that matters to anyone doubling up, because it is where a martingale started at one unit needs a 256-unit stake and 255 units already on the table. It arrives about once every 425 spins — an evening, at a live pace, or twenty minutes at the pace of a demo table. &lt;a href="https://betkyo.com/en/blog/the-martingale-priced-doubling-on-a-single-zero-wheel/" rel="noopener noreferrer"&gt;The martingale, priced&lt;/a&gt; works through what that costs; the short version is that the streak is not the risk, the table limit is.&lt;/p&gt;

&lt;p&gt;Streaks are also worth nothing as information. A run of eight reds changes the next spin’s red chance from 18 ÷ 37 to 18 ÷ 37. The reason streaks feel meaningful is that a 0.48% event is rare enough to remember and common enough to see, and memory keeps the streaks and discards the thousands of unremarkable spins between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same price, different swings
&lt;/h2&gt;

&lt;p&gt;Because tiles × multiplier equals 36 for every kind of bet, every bet on this wheel returns 97.30% and costs 2.7 units per 100 units staked. What differs, and differs enormously, is the swing — how far a session of a given length can end from that expected loss.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Every bet kind, priced and measured for swing&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;BET&lt;/th&gt;
&lt;th&gt;POCKETS&lt;/th&gt;
&lt;th&gt;WIN CHANCE&lt;/th&gt;
&lt;th&gt;PAYS&lt;/th&gt;
&lt;th&gt;RETURN&lt;/th&gt;
&lt;th&gt;SWING PER SPIN&lt;/th&gt;
&lt;th&gt;SWING OVER 100 SPINS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Straight&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2.70%&lt;/td&gt;
&lt;td&gt;×36&lt;/td&gt;
&lt;td&gt;97.30%&lt;/td&gt;
&lt;td&gt;5.84&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Split&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5.41%&lt;/td&gt;
&lt;td&gt;×18&lt;/td&gt;
&lt;td&gt;97.30%&lt;/td&gt;
&lt;td&gt;4.07&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Street&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;8.11%&lt;/td&gt;
&lt;td&gt;×12&lt;/td&gt;
&lt;td&gt;97.30%&lt;/td&gt;
&lt;td&gt;3.28&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corner / first four&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;10.81%&lt;/td&gt;
&lt;td&gt;×9&lt;/td&gt;
&lt;td&gt;97.30%&lt;/td&gt;
&lt;td&gt;2.79&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Six line&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;16.22%&lt;/td&gt;
&lt;td&gt;×6&lt;/td&gt;
&lt;td&gt;97.30%&lt;/td&gt;
&lt;td&gt;2.21&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dozen / column&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;32.43%&lt;/td&gt;
&lt;td&gt;×3&lt;/td&gt;
&lt;td&gt;97.30%&lt;/td&gt;
&lt;td&gt;1.40&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Red, black, odd, even, low, high&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;48.65%&lt;/td&gt;
&lt;td&gt;×2&lt;/td&gt;
&lt;td&gt;97.30%&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Swing per spin is the standard deviation of one spin’s result per unit staked, √(payout² × chance − 0.973²); over N spins it grows as √N. Expected loss over 100 one-unit spins is 2.7 units on every row.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read the last two columns together. A hundred one-unit spins on red lose 2.7 units on average with a standard deviation of 10, so ending anywhere between about 20 down and 15 up is unremarkable and the expected loss is a quarter of the noise. The same hundred spins on a single number lose the same 2.7 units on average with a standard deviation of 58: the typical outcome is either a loss of most of the hundred or one or two 36-unit hits that leave the session well ahead. The price is identical; the experience is not. &lt;a href="https://betkyo.com/en/blog/risk-of-ruin/" rel="noopener noreferrer"&gt;Risk of ruin&lt;/a&gt; turns this into how long a given bankroll lasts on each bet.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Roulette here is a solo table with no server clock — you spin when you press Spin — so “per hour” depends entirely on the player. At a spin every ten seconds, 100 spins is under twenty minutes; the table above is the honest unit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Checking a spin yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Before you play, the fairness panel shows the SHA-256 fingerprint of the server seed. Rotate your seed pair afterwards to reveal the seed and confirm the fingerprint.&lt;/li&gt;
&lt;li&gt;Compute HMAC-SHA256 with the server seed as the key and “clientSeed-nonce-0” as the message; a spin uses cursor 0 only.&lt;/li&gt;
&lt;li&gt;Take the first eight bytes of the digest as hi ÷ 2³² + lo ÷ 2⁶⁴ to get u, then floor(u × 37). That is the pocket, and every bet on the table settles from it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The open-source verifier does the three steps in one command, &lt;code&gt;betkyo-verify roulette &amp;lt;serverSeed&amp;gt; &amp;lt;clientSeed&amp;gt; &amp;lt;nonce&amp;gt;&lt;/code&gt;, and prints the pocket. If it matches the spin you were paid on, the pocket was fixed before you placed a chip — which, as &lt;a href="https://betkyo.com/en/blog/what-a-hash-commitment-proves/" rel="noopener noreferrer"&gt;what a hash commitment proves&lt;/a&gt; explains, is what the commitment guarantees and all it guarantees. The 1-in-37 is guaranteed by the published derivation, not by the hash.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What are the odds of hitting a single number in roulette?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1 in 37 per spin on this single-zero wheel, 2.70%. The number lands at least once in 37 spins 63.7% of the time and in 100 spins 93.5% of the time; the median wait is 26 spins and the mean is 37.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many spins does it take for a number to come up?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On average 37, but half of all waits are 26 spins or fewer and a few are very long: no hit in 100 spins happens 6.5% of the time, no hit in 200 spins 0.4%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are the odds of red coming up 10 times in a row?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(18 ÷ 37)¹⁰ = 0.074%, about 1 in 1,350. A losing run of ten on an even-money bet, which includes zero, is 0.128%, about 1 in 780. Neither changes the next spin, which is 18 ÷ 37 red regardless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How often does zero come up in roulette?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once in 37 spins on average. Zero appears at least once in 37 spins 63.7% of the time and in 74 spins 86.8%; it is absent from a full 37-spin cycle more than a third of the time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is a straight-up bet worse than red?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not in price: both return 97.30% on this wheel. A straight-up bet is far more volatile — a standard deviation of 5.84 stakes a spin against 1.00 for red — so it produces long dry runs and occasional ×36 wins rather than a steady drift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I verify a roulette spin?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. HMAC-SHA256 of “clientSeed-nonce-0” keyed by the revealed server seed, first eight bytes as a fraction of 2⁶⁴, times 37 and floored, gives the pocket; the verifier’s roulette command does it in one step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Betkyo engine source: deriveRouletteSpin(), rouletteNumbersOf() and rouletteMultOf() in roulette/derive.ts (pocket = floor(u × 37) at cursor 0; integer total-return multipliers ×36 … ×2); demoRouletteSpin() in _shared/demoLocal.ts; RouletteEngine.derivePocket() and settle() in the house service (U64SeedStream intBelow(37); stake × multiplier per covering key)&lt;/li&gt;
&lt;li&gt;Exact calculations written for this article: (36 ÷ 37)ᴺ waiting times and the binomial counts for 37 spins, (18 ÷ 37)ᵏ and (19 ÷ 37)ᵏ run probabilities and their mean spacing, per-spin standard deviation for every bet kind and its √N growth&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/betkyo-open-labs/provably-fair-verifier" rel="noopener noreferrer"&gt;Betkyo provably-fair verifier (GitHub, MIT): the roulette command reproduces the pocket from serverSeed, clientSeed and nonce&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>math</category>
      <category>probability</category>
      <category>statistics</category>
    </item>
    <item>
      <title>Crash odds, priced: the chance of every cash-out target</title>
      <dc:creator>Betkyo Research</dc:creator>
      <pubDate>Tue, 22 Sep 2026 02:41:09 +0000</pubDate>
      <link>https://dev.to/betkyo/crash-odds-priced-the-chance-of-every-cash-out-target-ol9</link>
      <guid>https://dev.to/betkyo/crash-odds-priced-the-chance-of-every-cash-out-target-ol9</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published in the &lt;a href="https://betkyo.com/en/blog/crash-odds-priced-the-chance-of-every-cash-out-target/" rel="noopener noreferrer"&gt;Betkyo Journal&lt;/a&gt;. Drafted with AI assistance; every figure was checked against the game engine source and approved by a human editor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A crash round is one hidden number and a curve that climbs toward it. The number is drawn by a formula that is four lines long, and the curve is a clock, so every question a player asks — how often does ×2 pay, how often does it bust at once, how long is a ride to ×10 — has an exact answer. We priced all of them from the engine, including the one-hundredth gap between a multiplier you see and a multiplier you are paid.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick answer:&lt;/strong&gt; On this engine a crash bet with an auto cash-out at target x is paid when the round busts &lt;strong&gt;strictly above&lt;/strong&gt; x, and the chance of that is exactly &lt;strong&gt;0.99 ÷ x&lt;/strong&gt;: &lt;strong&gt;90.00% at ×1.10, 49.50% at ×2, 9.90% at ×10, 0.99% at ×100&lt;/strong&gt; and &lt;strong&gt;0.0099%, one in 10,101, at ×9,999.99&lt;/strong&gt;, the highest target that can ever pay. Multiply by the payout and every target returns &lt;strong&gt;99.00%&lt;/strong&gt; — a flat 1% house edge, the same as limbo. The bust itself lands on &lt;strong&gt;×1.00 in exactly 1% of rounds&lt;/strong&gt;, between ×1.01 and ×1.99 in 49.25%, at ×10 or higher in 9.90%, and on the ×10,000 cap once in 10,101. The curve doubles every ten seconds, so ×2 arrives at 10.0 s, ×10 at 33.2 s and ×100 at 66.4 s; the median round ends just under ten seconds in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number and the clock
&lt;/h2&gt;

&lt;p&gt;Crash looks like a race against a rocket, and mechanically it is two much simpler things. Before the round starts the engine draws one hidden number, the bust point, from a committed hash. Then a clock starts and a multiplier climbs along a fixed curve; when the curve reaches the bust point the round is over, and everyone still riding loses their stake. A cash-out — manual, or an auto target set before the round — locks the multiplier at that moment and pays stake times multiplier. Nothing about the flight is random: the only random thing in the round is the number drawn before it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Verified in the engine:&lt;/strong&gt; CrashDerivation.crashPoint100() in the house service (crash/CrashEngine.kt), mirrored by bust100() in the client’s _shared/rng.ts: h is the top 52 bits of HMAC-SHA256(chain link, salt); with e = 2⁵² and n = 100 the bust point in hundredths is floor((n·e − h) ÷ (e − h)), clamped to the range 100 to 1,000,000. That is the bustabit formula, computed in integers so that the client verifier and the server agree bit for bit. The 1% edge is the n: n = 101 − 100 × house edge, so 100 at 1%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verified in the engine:&lt;/strong&gt; multiplier100() in the same file and crashMultiplier() in the client’s crash/api.ts: the live multiplier after t seconds is floor(100 × e^(0.069314718 t)) hundredths, never below 100. The growth constant is ln 2 ÷ 10, so the multiplier doubles every ten seconds; msToReach() inverts it to schedule the bust.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Write the random part as a fraction u = h ÷ 2⁵², spread evenly between 0 and 1, and the bust formula becomes floor((100 − u) ÷ (1 − u)) hundredths. At u = 0 that is exactly 100, a bust at ×1.00 before the curve has moved; as u approaches 1 it runs away, and the clamp stops it at 1,000,000 hundredths, ×10,000. Everything below follows from that one line and the strict rule for what counts as a win.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strictly above: the rule that sets the price
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Verified in the engine:&lt;/strong&gt; settleCrash() and applyAutoCashouts() in crash/CrashEngine.kt: an auto target pays only when target &amp;lt; bust point (“auto &amp;lt; crashPoint100”); a target equal to the bust point busts. Mid-flight the reachable multiplier is capped at bust point − 1, so an auto target fires the instant the live curve reaches it and never above the bust. cashout(): a manual cash-out at live multiplier m is refused when m ≥ bust point. The payout is stake × multiplier ÷ 100 floored to the coin’s raw unit (mult(), RoundingMode.FLOOR).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the detail the odds hinge on. A target of T hundredths does not win when the bust point equals T; it wins only when the bust point is at least T + 1. From the formula, the chance that the bust point is at least K hundredths is 99 ÷ (K − 1) for any K from 101 up, so the chance that it is at least T + 1 is 99 ÷ T. For a target of ×2, that is 99 ÷ 200 = 49.50%. Multiply by the ×2 payout and the return is 0.99 — and the T cancels the same way at every target.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Win chance, odds and volatility at common auto cash-out targets&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TARGET&lt;/th&gt;
&lt;th&gt;WIN CHANCE&lt;/th&gt;
&lt;th&gt;ONE WIN IN&lt;/th&gt;
&lt;th&gt;RETURN&lt;/th&gt;
&lt;th&gt;HOUSE EDGE&lt;/th&gt;
&lt;th&gt;SWING PER UNIT STAKED&lt;/th&gt;
&lt;th&gt;REACHED AT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;×1.01&lt;/td&gt;
&lt;td&gt;98.02%&lt;/td&gt;
&lt;td&gt;1.02 rounds&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;0.14&lt;/td&gt;
&lt;td&gt;0.14 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.10&lt;/td&gt;
&lt;td&gt;90.00%&lt;/td&gt;
&lt;td&gt;1.11&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;0.33&lt;/td&gt;
&lt;td&gt;1.4 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.20&lt;/td&gt;
&lt;td&gt;82.50%&lt;/td&gt;
&lt;td&gt;1.21&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;0.46&lt;/td&gt;
&lt;td&gt;2.6 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.50&lt;/td&gt;
&lt;td&gt;66.00%&lt;/td&gt;
&lt;td&gt;1.52&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;0.71&lt;/td&gt;
&lt;td&gt;5.8 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.98&lt;/td&gt;
&lt;td&gt;50.00%&lt;/td&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;0.99&lt;/td&gt;
&lt;td&gt;9.9 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×2.00&lt;/td&gt;
&lt;td&gt;49.50%&lt;/td&gt;
&lt;td&gt;2.02&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;10.0 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×3.00&lt;/td&gt;
&lt;td&gt;33.00%&lt;/td&gt;
&lt;td&gt;3.03&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;1.41&lt;/td&gt;
&lt;td&gt;15.8 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×5.00&lt;/td&gt;
&lt;td&gt;19.80%&lt;/td&gt;
&lt;td&gt;5.05&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;1.99&lt;/td&gt;
&lt;td&gt;23.2 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10&lt;/td&gt;
&lt;td&gt;9.90%&lt;/td&gt;
&lt;td&gt;10.1&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;2.99&lt;/td&gt;
&lt;td&gt;33.2 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×20&lt;/td&gt;
&lt;td&gt;4.95%&lt;/td&gt;
&lt;td&gt;20.2&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;4.34&lt;/td&gt;
&lt;td&gt;43.2 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×50&lt;/td&gt;
&lt;td&gt;1.98%&lt;/td&gt;
&lt;td&gt;50.5&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;6.97&lt;/td&gt;
&lt;td&gt;56.4 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×100&lt;/td&gt;
&lt;td&gt;0.99%&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;9.90&lt;/td&gt;
&lt;td&gt;66.4 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1,000&lt;/td&gt;
&lt;td&gt;0.099%&lt;/td&gt;
&lt;td&gt;1,010&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;31.4&lt;/td&gt;
&lt;td&gt;99.7 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×9,999.99&lt;/td&gt;
&lt;td&gt;0.0099%&lt;/td&gt;
&lt;td&gt;10,101&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;99.5&lt;/td&gt;
&lt;td&gt;132.9 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Win chance = 99 ÷ T with T the target in hundredths, exact under the strict rule. Return = target × win chance = 0.99 at every row. Swing is the standard deviation of one round’s result per unit staked, √(0.99 × target − 0.9801). “Reached at” is 10 × log₂(target) seconds on the doubling curve. The lowest target the bet form accepts is ×1.01; ×10,000.00 is the bust cap itself and a target there can never be strictly below the bust, so ×9,999.99 is the top of the table.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The two middle columns do not move. Crash under this rule is priced exactly like limbo: 1% of every unit staked, whatever target you pick, whether you cash out by hand at ×1.37 or set an auto target at ×500. What the target changes is the shape of the result — a stream of small wins at ×1.10, a drought broken by a windfall at ×1,000 — and the last two columns measure that. At ×2 a round swings by about one stake; at ×1,000, by thirty-one stakes. The ride to ×1,000 also takes a hundred seconds, which is a different kind of cost.&lt;/p&gt;

&lt;p&gt;One row deserves a second look. ×1.98 wins exactly half the time, which makes it the median bust point: half of all rounds bust above ×1.98 and half at or below it. The round number ×2.00 is a coin flip with a half-point handicap, 49.50%, and that half point is where the 1% lives at that target.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seen versus paid: the one-hundredth gap
&lt;/h2&gt;

&lt;p&gt;There are two questions that sound the same and are not. How often does the curve show ×2.00? And how often does a ×2.00 target get paid? The first is the chance that the bust point is at least 200 hundredths, 99 ÷ 199 = 49.75%. The second is the chance that it is at least 201, 99 ÷ 200 = 49.50%. The difference, one round in 402, is the round that busts on exactly ×2.00: the screen reaches the number and the ticket loses.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How often the curve reaches a multiplier versus how often a target there is paid&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MULTIPLIER&lt;/th&gt;
&lt;th&gt;CURVE REACHES IT&lt;/th&gt;
&lt;th&gt;TARGET IS PAID&lt;/th&gt;
&lt;th&gt;BUSTS ON IT EXACTLY&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;×1.01&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;98.02%&lt;/td&gt;
&lt;td&gt;0.98%, 1 in 102&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.10&lt;/td&gt;
&lt;td&gt;90.83%&lt;/td&gt;
&lt;td&gt;90.00%&lt;/td&gt;
&lt;td&gt;0.83%, 1 in 121&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.50&lt;/td&gt;
&lt;td&gt;66.44%&lt;/td&gt;
&lt;td&gt;66.00%&lt;/td&gt;
&lt;td&gt;0.44%, 1 in 226&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×2.00&lt;/td&gt;
&lt;td&gt;49.75%&lt;/td&gt;
&lt;td&gt;49.50%&lt;/td&gt;
&lt;td&gt;0.25%, 1 in 402&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×3.00&lt;/td&gt;
&lt;td&gt;33.11%&lt;/td&gt;
&lt;td&gt;33.00%&lt;/td&gt;
&lt;td&gt;0.11%, 1 in 906&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×5.00&lt;/td&gt;
&lt;td&gt;19.84%&lt;/td&gt;
&lt;td&gt;19.80%&lt;/td&gt;
&lt;td&gt;0.040%, 1 in 2,520&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10&lt;/td&gt;
&lt;td&gt;9.910%&lt;/td&gt;
&lt;td&gt;9.900%&lt;/td&gt;
&lt;td&gt;0.0099%, 1 in 10,091&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×100&lt;/td&gt;
&lt;td&gt;0.9901%&lt;/td&gt;
&lt;td&gt;0.9900%&lt;/td&gt;
&lt;td&gt;1 in 1,010,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Reaches = 99 ÷ (T − 1); paid = 99 ÷ T; the difference is 99 ÷ (T (T − 1)), the probability mass on the single hundredth T. The gap matters at low targets and vanishes at high ones.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This gap is the reason the engine draws the bust point as an integer number of hundredths rather than as a decimal that is rounded afterwards. With an integer draw, the strict rule hands exactly one hundredth of the distribution to the house at every target, and that one hundredth is what makes the return come out at 0.99 rather than a little above it. Our earlier comparison of &lt;a href="https://betkyo.com/en/blog/two-rides-two-curves/" rel="noopener noreferrer"&gt;limbo and crash&lt;/a&gt; priced crash from the “reaches it” column, 99x ÷ (100x − 1), and concluded that short rides were fractionally cheaper than 99%. That was the wrong column: under the engine’s strict settlement the price is 99.00% at every target, and the article now carries a correction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the bust lands when nobody is aiming
&lt;/h2&gt;

&lt;p&gt;The same formula describes the round itself, regardless of what anyone bets. The chance that the bust point is at least K hundredths is 99 ÷ (K − 1), and that gives the whole distribution of what the history bar shows.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Where the bust point lands&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;RANGE&lt;/th&gt;
&lt;th&gt;SHARE OF ROUNDS&lt;/th&gt;
&lt;th&gt;ABOUT&lt;/th&gt;
&lt;th&gt;HOW LONG THE ROUND LASTS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;×1.00 (instant bust)&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;1 in 100&lt;/td&gt;
&lt;td&gt;0 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.01 to ×1.99&lt;/td&gt;
&lt;td&gt;49.25%&lt;/td&gt;
&lt;td&gt;1 in 2.0&lt;/td&gt;
&lt;td&gt;0.1 to 9.9 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×2.00 to ×9.99&lt;/td&gt;
&lt;td&gt;39.84%&lt;/td&gt;
&lt;td&gt;1 in 2.5&lt;/td&gt;
&lt;td&gt;10 to 33 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10 to ×99.99&lt;/td&gt;
&lt;td&gt;8.92%&lt;/td&gt;
&lt;td&gt;1 in 11.2&lt;/td&gt;
&lt;td&gt;33 to 66 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×100 to ×999.99&lt;/td&gt;
&lt;td&gt;0.891%&lt;/td&gt;
&lt;td&gt;1 in 112&lt;/td&gt;
&lt;td&gt;66 to 100 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1,000 to ×9,999.99&lt;/td&gt;
&lt;td&gt;0.0891%&lt;/td&gt;
&lt;td&gt;1 in 1,122&lt;/td&gt;
&lt;td&gt;100 to 133 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10,000.00 (the cap)&lt;/td&gt;
&lt;td&gt;0.0099%&lt;/td&gt;
&lt;td&gt;1 in 10,101&lt;/td&gt;
&lt;td&gt;133 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Each row is 99 ÷ (lower − 1) minus 99 ÷ upper, in hundredths. The first row is the chance that (100 − u) ÷ (1 − u) falls below 101, u &amp;lt; 1 ÷ 100. The last row is every draw the clamp pins to 1,000,000 hundredths. Rows sum to 100%. Durations are 10 × log₂(multiplier) seconds.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two rows explain most of what a crash session feels like. Exactly one round in a hundred busts at ×1.00, before the curve has moved a single hundredth, and no target — not even ×1.01 — is paid on it. And about one round in ten reaches ×10, which is often enough to be seen several times an hour and to make a high target feel reachable. It is reachable; the table says how often, and “often enough to remember” is a different number from often. The median round busts at ×1.98, just under ten seconds in, and the average round lasts 14.3 seconds because the rare long flights pull the mean up.&lt;/p&gt;

&lt;p&gt;The rounds you sat out are drawn from this same distribution, and every one of them is a fresh HMAC of a fresh chain link. A ×500 in the history bar makes the next ×500 exactly as likely as it was before, 0.198%. That is the &lt;a href="https://betkyo.com/en/blog/gamblers-fallacy/" rel="noopener noreferrer"&gt;gambler’s fallacy&lt;/a&gt; in its purest form — here independence is not a statistical assumption but a property of the hash.&lt;/p&gt;

&lt;h2&gt;
  
  
  What chasing a big multiplier costs
&lt;/h2&gt;

&lt;p&gt;Because the edge is the same everywhere, the choice of target is a choice about variance, and variance has a price that is easy to state: how many rounds you should expect to wait, and how likely a long wait is. With win chance p per round, the chance of at least one win in N rounds is 1 − (1 − p)ᴺ.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Chance of at least one win when betting the same target every round&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TARGET&lt;/th&gt;
&lt;th&gt;ROUNDS&lt;/th&gt;
&lt;th&gt;AT LEAST ONE WIN&lt;/th&gt;
&lt;th&gt;NO WIN AT ALL&lt;/th&gt;
&lt;th&gt;TIME AT THE TABLE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;×2&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;99.89%&lt;/td&gt;
&lt;td&gt;0.11%&lt;/td&gt;
&lt;td&gt;about 4 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;87.57%&lt;/td&gt;
&lt;td&gt;12.43%&lt;/td&gt;
&lt;td&gt;about 8 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;99.46%&lt;/td&gt;
&lt;td&gt;0.54%&lt;/td&gt;
&lt;td&gt;about 20 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;63.03%&lt;/td&gt;
&lt;td&gt;36.97%&lt;/td&gt;
&lt;td&gt;about 41 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×100&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;94.95%&lt;/td&gt;
&lt;td&gt;5.05%&lt;/td&gt;
&lt;td&gt;about 2 h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1,000&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;62.86%&lt;/td&gt;
&lt;td&gt;37.14%&lt;/td&gt;
&lt;td&gt;about 7 h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1,000&lt;/td&gt;
&lt;td&gt;3,000&lt;/td&gt;
&lt;td&gt;94.88%&lt;/td&gt;
&lt;td&gt;5.12%&lt;/td&gt;
&lt;td&gt;about 20 h&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;1 − (1 − 99 ÷ T)ᴺ, identical to limbo because the win chance is the same. Time assumes the average flight of 14.3 s plus the ten-second betting window, 24.3 s per round; a session at ×1,000 is dominated by the wait, not by the flight.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Put a stake on it and the arithmetic turns cold. A hundred one-unit bets at ×100 cost 100 units to place and return 99 on average — the 1% again — but the average is made of a 63% chance of getting back roughly 100 and a 37% chance of getting back nothing. Nothing about the target changes the 1% you pay per unit. Everything about it changes how the results are distributed among players, and in crash it also changes how long you sit watching a curve.&lt;/p&gt;

&lt;p&gt;The low-target version of the same trap is the martingale: cash out at ×2, double after each loss, and collect one unit per win. The win chance at ×2 is 49.50%, a losing run of ten happens 0.11% of the time, and the eleventh bet is 1,024 units. &lt;a href="https://betkyo.com/en/blog/the-martingale-priced-doubling-on-a-single-zero-wheel/" rel="noopener noreferrer"&gt;The martingale, priced&lt;/a&gt; works that through on a roulette wheel; the crash figures are within a tenth of a point of it. &lt;a href="https://betkyo.com/en/blog/risk-of-ruin/" rel="noopener noreferrer"&gt;Risk of ruin&lt;/a&gt; gives the general formula for how long any fixed-stake plan lasts against a 1% edge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cashing out by hand
&lt;/h2&gt;

&lt;p&gt;A manual cash-out is paid at whatever hundredth the live multiplier shows when the server receives it, provided that hundredth is still strictly below the bust point. The curve does not tick evenly: floor(100 × e^(0.0693 t)) advances by one hundredth every 143 ms near ×1.01, every 72 ms around ×2, every 14 ms around ×10, and every 1.4 ms around ×100. A hand on the button at ×10 is choosing a number to within a few hundredths, at ×100 to within a few tenths, and the hundredth that finally lands is decided by network latency as much as by intent. None of that changes the price — each hundredth is paid at exactly 99% in expectation — but it does mean a manual target above ×10 is a looser instrument than an auto target, which fires at exactly the number you typed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Verified in the engine:&lt;/strong&gt; crashGame.tsx: the client shows an auto target as cashed the instant floor(live multiplier × 100) reaches it, matching the server’s applyAutoCashouts(), which locks the ticket at exactly the target and refuses a later manual cash-out on it. bet(): an auto target below 101 hundredths (×1.01) is rejected.&lt;/p&gt;

&lt;p&gt;One practical detail from the settlement: the payout is stake × multiplier ÷ 100 floored to the coin’s smallest unit, so a stake of 0.37 at ×1.23 pays 0.45, not 0.4551. On round stakes at a two-decimal multiplier the product is exact and nothing is lost; on small odd stakes the fraction of a unit is.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Checking a round yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Before the round, the panel shows the commit hash of the chain and the salt. After the round it reveals the chain link for that round; hashing the link must give the previous round’s link, which is how the chain proves the order was fixed in advance.&lt;/li&gt;
&lt;li&gt;Compute HMAC-SHA256 with the revealed link as the key and the salt as the message. Take the first 52 bits of the digest — the first thirteen hex characters — as h.&lt;/li&gt;
&lt;li&gt;Compute floor((100 × 2⁵² − h) ÷ (2⁵² − h)) in integer arithmetic and clamp it to 100–1,000,000. That is the bust point in hundredths, and it should match the number the round crashed on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Any HMAC-SHA256 tool and a big-integer calculator will do; the open-source verifier’s shared HMAC helper is the same primitive. The integer division is not optional: a floating-point version disagrees with the server at the floor boundaries, which is exactly the hundredth the strict rule is about. &lt;a href="https://betkyo.com/en/blog/one-rounding-not-many-why-the-verifier-matches-the-server-bit-for-bit/" rel="noopener noreferrer"&gt;One rounding, not many&lt;/a&gt; explains why the verifier reproduces the server’s arithmetic rather than approximating it.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What are the odds of winning at ×2 in crash?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;49.50% on this engine. A target pays only when the round busts strictly above it, and the chance the bust point is at least 201 hundredths is 99 ÷ 200. The curve reaches ×2.00 slightly more often, 49.75%; the difference is the one round in 402 that busts on exactly ×2.00.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the house edge in crash?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.00% at every cash-out target, manual or auto. The win chance is 99 ÷ target in hundredths and the payout is the target, so every bet returns 99.00% of the stake on average — the same price as limbo on this engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How often does crash bust at 1.00?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exactly 1% of rounds, one in a hundred. The bust point is floor((100 − u) ÷ (1 − u)) hundredths, which is 100 whenever u is below 1 ÷ 100. No target, not even ×1.01, is paid on those rounds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the best cash-out multiplier for crash?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;None in expectation: every target costs 1% per unit staked. Low targets pay small amounts often and keep the swing near one stake; high targets pay rarely and swing by tens of stakes. ×1.98 is the exact 50/50 point and the median bust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long does a crash round last?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The multiplier doubles every ten seconds, so ×2 arrives at 10.0 s, ×10 at 33.2 s, ×100 at 66.4 s and the ×10,000 cap at 132.9 s. The median round busts just under ten seconds in; the average round lasts 14.3 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a ×10,000 auto target ever pay?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. ×10,000.00 is the bust cap, and a target must be strictly below the bust to pay, so the highest target that can ever be paid is ×9,999.99, once in 10,101 rounds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is crash cheaper than limbo for short rides?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not on this engine. An earlier article priced crash from the chance the curve reaches a multiplier and found 99.99% at ×1.01; under the strict settlement the chance that counts is one hundredth lower, and the return is exactly 99.00% at every target, as in limbo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Betkyo engine source, house service: CrashDerivation.crashPoint100(), multiplier100(), msToReach(), applyAutoCashouts(), settleCrash(), mult() and cashout() in crash/CrashEngine.kt (bustabit integer bust point, strict “target &amp;lt; bust point” settlement, floor-to-unit payout, ×1.01 minimum auto target)&lt;/li&gt;
&lt;li&gt;Betkyo engine source, client: bust100() and h52() in _shared/rng.ts (the same integer formula, BigInt); CRASH_GROWTH_R and crashMultiplier() in crash/api.ts; the auto-cashout display rule in crash/crashGame.tsx&lt;/li&gt;
&lt;li&gt;Exact calculations written for this article: P(bust ≥ K) = 99 ÷ (K − 1) for K ≥ 101 from the integer formula, the strict-rule win chance 99 ÷ T, the reached-versus-paid gap 99 ÷ (T (T − 1)), the bust distribution by range, flight times 10 × log₂(x), the mean flight of 14.3 s summed over all 999,900 bust values, and at-least-one-win probabilities&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>math</category>
      <category>probability</category>
      <category>statistics</category>
    </item>
    <item>
      <title>Limbo odds, priced: the win chance behind every target multiplier</title>
      <dc:creator>Betkyo Research</dc:creator>
      <pubDate>Sat, 19 Sep 2026 03:43:20 +0000</pubDate>
      <link>https://dev.to/betkyo/limbo-odds-priced-the-win-chance-behind-every-target-multiplier-4a4l</link>
      <guid>https://dev.to/betkyo/limbo-odds-priced-the-win-chance-behind-every-target-multiplier-4a4l</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published in the &lt;a href="https://betkyo.com/en/blog/limbo-odds-priced-the-win-chance-behind-every-target-multiplier/" rel="noopener noreferrer"&gt;Betkyo Journal&lt;/a&gt;. Drafted with AI assistance; every figure was checked against the game engine source and approved by a human editor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Limbo asks one question: will the number be at least as high as your target? The engine answers it with a single line of arithmetic, and that line can be priced exactly for every target the box accepts. Here is the win chance at every multiplier, why the house edge is the same 1% everywhere, how often the number stops below ×1.01, and what chasing ×100 or ×1,000 actually costs in patience.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick answer:&lt;/strong&gt; On this engine’s limbo the win chance at any target is &lt;strong&gt;99 divided by the target&lt;/strong&gt;: &lt;strong&gt;90.00% at ×1.10, 49.50% at ×2, 9.90% at ×10, 0.99% at ×100&lt;/strong&gt; and &lt;strong&gt;0.0099%, one in 10,101, at the ×10,000 cap&lt;/strong&gt;. Because the target is also the payout, every target returns exactly &lt;strong&gt;99.00% of the stake&lt;/strong&gt; and the house edge is &lt;strong&gt;1.00% at every multiplier&lt;/strong&gt;, from ×1.01 to ×10,000 — no target is better value than another, only more volatile. The rounding in the engine’s formula changes the number you see, not the odds you get. The number lands below ×1.01, where nothing can win, &lt;strong&gt;1.98% of the time&lt;/strong&gt;; its median is &lt;strong&gt;×1.98&lt;/strong&gt;; it reaches ×10 or more once in ten rounds and ×100 or more once in a hundred. Chasing ×100 at one bet a round, you have a &lt;strong&gt;63% chance of at least one hit in 100 rounds&lt;/strong&gt; and a 5% chance of none in 300.&lt;/p&gt;

&lt;h2&gt;
  
  
  One line of arithmetic
&lt;/h2&gt;

&lt;p&gt;Limbo has no board, no cards and no wheel. You type a target multiplier, the engine draws a number, and you win if the number is at least your target — in which case you are paid your target times your stake. That is the entire game, and it makes limbo the easiest casino game there is to price, because the number comes from one formula with one random input.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Verified in the engine:&lt;/strong&gt; curve100() in _shared/rng.ts: the outcome in hundredths is floor((0.99 ÷ (1 − u)) × 100), clamped to the range 100 to 1,000,000, where u is the uniform number in [0, 1) read from the round’s HMAC — the first eight bytes of the digest as hi ÷ 2³² + lo ÷ 2⁶⁴ (u64()). demoLimboBet() in _shared/demoLocal.ts draws u at cursor 0, sets win = outcome100 ≥ target100 and pays stake × target100 ÷ 100 floored to the cent. limboGame.tsx accepts targets from 101 to 1,000,000 hundredths (×1.01 to ×10,000.00) and shows the win chance as 99 ÷ target.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read the formula from the inside out. The random number u is spread evenly between 0 and 1. Dividing 0.99 by 1 − u turns that even spread into a curve: u near 0 gives a number near ×0.99, u near 1 gives a number that runs away towards infinity. The ×100 and the floor turn it into a figure with two decimals, and the clamp pins it between ×1.00 and ×10,000.00. The 0.99 is the house edge, and it is the only place the edge lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  The win chance at every target
&lt;/h2&gt;

&lt;p&gt;You win at target T when floor(99 ÷ (1 − u)) is at least T, written in hundredths. Because T is a whole number of hundredths, the floor makes no difference to that comparison: a value of 199.7 floors to 199 and misses a target of 200, exactly as 199.7 itself would. So the condition is simply 99 ÷ (1 − u) ≥ T, which rearranges to u ≥ 1 − 99 ÷ T. The chance of a uniform number landing there is 99 ÷ T, and that is the whole answer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Win chance, odds and volatility at common targets&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TARGET&lt;/th&gt;
&lt;th&gt;WIN CHANCE&lt;/th&gt;
&lt;th&gt;ONE WIN IN&lt;/th&gt;
&lt;th&gt;RETURN&lt;/th&gt;
&lt;th&gt;HOUSE EDGE&lt;/th&gt;
&lt;th&gt;SWING PER UNIT STAKED&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;×1.01&lt;/td&gt;
&lt;td&gt;98.02%&lt;/td&gt;
&lt;td&gt;1.02 rounds&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;0.14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.10&lt;/td&gt;
&lt;td&gt;90.00%&lt;/td&gt;
&lt;td&gt;1.11&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;0.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.20&lt;/td&gt;
&lt;td&gt;82.50%&lt;/td&gt;
&lt;td&gt;1.21&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;0.46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.50&lt;/td&gt;
&lt;td&gt;66.00%&lt;/td&gt;
&lt;td&gt;1.52&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;0.71&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.98&lt;/td&gt;
&lt;td&gt;50.00%&lt;/td&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;0.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×2.00&lt;/td&gt;
&lt;td&gt;49.50%&lt;/td&gt;
&lt;td&gt;2.02&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×3.00&lt;/td&gt;
&lt;td&gt;33.00%&lt;/td&gt;
&lt;td&gt;3.03&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;1.41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×5.00&lt;/td&gt;
&lt;td&gt;19.80%&lt;/td&gt;
&lt;td&gt;5.05&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;1.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10&lt;/td&gt;
&lt;td&gt;9.90%&lt;/td&gt;
&lt;td&gt;10.1&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;2.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×20&lt;/td&gt;
&lt;td&gt;4.95%&lt;/td&gt;
&lt;td&gt;20.2&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;4.34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×50&lt;/td&gt;
&lt;td&gt;1.98%&lt;/td&gt;
&lt;td&gt;50.5&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;6.97&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×100&lt;/td&gt;
&lt;td&gt;0.99%&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;9.90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1,000&lt;/td&gt;
&lt;td&gt;0.099%&lt;/td&gt;
&lt;td&gt;1,010&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;31.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10,000&lt;/td&gt;
&lt;td&gt;0.0099%&lt;/td&gt;
&lt;td&gt;10,101&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;99.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Win chance = 99 ÷ target, exact. Return = target × win chance = 0.99 at every row. Swing is the standard deviation of one round’s result per unit staked, √(0.99 × target − 0.9801); it is the number that grows, not the price.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The middle two columns are the point of the table, and they do not move. The target is both the hurdle and the payout, so raising it lowers the win chance in exactly the proportion that raises the prize, and the product stays at 0.99. A player who sits at ×1.10 and a player who fires at ×1,000 are paying the same 1% for every unit they stake; one of them is paying it in a steady trickle and the other in long droughts broken by a windfall. The last column measures the difference. At ×2 a round’s result swings by about one stake; at ×1,000, by thirty-one stakes; at the cap, by a hundred.&lt;/p&gt;

&lt;p&gt;One row is worth a second look. At ×1.98 the win chance is exactly 50%, which makes ×1.98 the median outcome: half of all rounds end above it and half below. The round-number ×2.00 is a coin flip with a 0.5-point handicap, 49.50%, and that half point is where the 1% edge sits at that target. Every other target hides the same edge in the same way — a fair game would pay ×2.0202 for a 49.5% chance, and the engine pays ×2.&lt;/p&gt;

&lt;p&gt;This is the part of limbo that differs from a dice game with a two-decimal multiplier. There, the payout is derived from the chosen chance and rounded, and the rounding can cost the player a few hundredths of a point at some settings. In limbo the player names the payout directly, in hundredths, and the formula compares the drawn number against that same figure; there is no second rounding to pay for. The floor in the formula decides only which two decimals appear on screen. The &lt;a href="https://betkyo.com/en/blog/one-rounding-not-many-why-the-verifier-matches-the-server-bit-for-bit/" rel="noopener noreferrer"&gt;verifier article&lt;/a&gt; explains why that single floor has to be reproduced exactly when you check a round.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the number lands when nobody is aiming
&lt;/h2&gt;

&lt;p&gt;The same formula describes the drawn number itself, regardless of any target. The chance that it reaches at least ×x is 0.99 ÷ x, for any x from ×1.01 upwards, and that gives the whole distribution of what the screen shows.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Where the drawn multiplier lands&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;RANGE&lt;/th&gt;
&lt;th&gt;SHARE OF ROUNDS&lt;/th&gt;
&lt;th&gt;ABOUT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;×1.00 (below every target)&lt;/td&gt;
&lt;td&gt;1.98%&lt;/td&gt;
&lt;td&gt;1 in 50.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.01 to ×1.49&lt;/td&gt;
&lt;td&gt;32.02%&lt;/td&gt;
&lt;td&gt;1 in 3.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1.50 to ×1.99&lt;/td&gt;
&lt;td&gt;16.50%&lt;/td&gt;
&lt;td&gt;1 in 6.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×2.00 to ×2.99&lt;/td&gt;
&lt;td&gt;16.50%&lt;/td&gt;
&lt;td&gt;1 in 6.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×3.00 to ×4.99&lt;/td&gt;
&lt;td&gt;13.20%&lt;/td&gt;
&lt;td&gt;1 in 7.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×5.00 to ×9.99&lt;/td&gt;
&lt;td&gt;9.90%&lt;/td&gt;
&lt;td&gt;1 in 10.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10 to ×99.99&lt;/td&gt;
&lt;td&gt;8.91%&lt;/td&gt;
&lt;td&gt;1 in 11.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×100 to ×999.99&lt;/td&gt;
&lt;td&gt;0.891%&lt;/td&gt;
&lt;td&gt;1 in 112&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1,000 to ×9,999.99&lt;/td&gt;
&lt;td&gt;0.0891%&lt;/td&gt;
&lt;td&gt;1 in 1,122&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10,000.00 (the cap)&lt;/td&gt;
&lt;td&gt;0.0099%&lt;/td&gt;
&lt;td&gt;1 in 10,101&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Each row is 0.99 ÷ (lower bound) minus 0.99 ÷ (upper bound). The first row is the chance that 99 ÷ (1 − u) falls below 101 hundredths, u &amp;lt; 2 ÷ 101. The last row is every draw that the clamp pins to 1,000,000 hundredths. Rows sum to 100%.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two of these rows explain most of what a limbo session feels like. About one round in fifty shows ×1.00, a number no target can beat: the 0.99 in the formula means the curve starts below ×1.01, and the lowest 1.98% of draws never clear it. And about one round in eleven shows ×10 or more, which is frequent enough to be seen several times an hour and to make a high target feel reachable. It is reachable — one round in a hundred and one clears ×100 — but the table says how often, and “often enough to remember” is not the same as often.&lt;/p&gt;

&lt;p&gt;The rounds you are not betting on are drawn from this same distribution, which is why a screen full of recent results carries no information about the next one. Every round is a fresh HMAC of a fresh nonce; a ×500 in the history makes the next ×500 exactly as likely as it was before, 0.198%. That is the &lt;a href="https://betkyo.com/en/blog/gamblers-fallacy/" rel="noopener noreferrer"&gt;gambler’s fallacy&lt;/a&gt; in its purest form, because here the independence is not a statistical assumption but a property of the hash.&lt;/p&gt;

&lt;h2&gt;
  
  
  What chasing a big multiplier costs
&lt;/h2&gt;

&lt;p&gt;Because the edge is the same everywhere, the choice of target is a choice about variance, and variance has a price that is easy to state: how many rounds you should expect to wait, and how likely a long wait is. With win chance p per round, the chance of at least one win in N rounds is 1 − (1 − p)ᴺ.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Chance of at least one win when betting the same target every round&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;TARGET&lt;/th&gt;
&lt;th&gt;ROUNDS&lt;/th&gt;
&lt;th&gt;AT LEAST ONE WIN&lt;/th&gt;
&lt;th&gt;NO WIN AT ALL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;×2&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;99.89%&lt;/td&gt;
&lt;td&gt;0.11%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;87.57%&lt;/td&gt;
&lt;td&gt;12.43%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×10&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;99.46%&lt;/td&gt;
&lt;td&gt;0.54%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;63.03%&lt;/td&gt;
&lt;td&gt;36.97%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×100&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;94.95%&lt;/td&gt;
&lt;td&gt;5.05%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1,000&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;62.86%&lt;/td&gt;
&lt;td&gt;37.14%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;×1,000&lt;/td&gt;
&lt;td&gt;3,000&lt;/td&gt;
&lt;td&gt;94.88%&lt;/td&gt;
&lt;td&gt;5.12%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;1 − (1 − 99 ÷ T)ᴺ. The pattern repeats at every scale: betting the target’s own number of rounds (100 rounds at ×100, 1,000 at ×1,000) gives about a 63% chance of one hit, and three times that many gives about 95%.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Put a stake on it and the arithmetic turns cold. A hundred one-unit bets at ×100 cost 100 units to place and return 99 on average — the 1% again — but the average is made of a 63% chance of getting back roughly 100 and a 37% chance of getting back nothing. The player who does hit once in those hundred rounds is not ahead by much; the player who hits twice is up a lot, and the one who hits zero times has lost the whole hundred. Nothing about the target changes the 1% you pay per unit. Everything about it changes how the results are distributed among players.&lt;/p&gt;

&lt;p&gt;The low-target version of the same trap is the martingale: bet ×2, double after each loss, and collect one unit per win. The win chance at ×2 is 49.50%, a losing run of ten in a row happens 0.11% of the time, and the eleventh bet is 1,024 units. &lt;a href="https://betkyo.com/en/blog/the-martingale-priced-doubling-on-a-single-zero-wheel/" rel="noopener noreferrer"&gt;The martingale, priced&lt;/a&gt; works that through on a roulette wheel; the limbo figures are within a tenth of a point of it. &lt;a href="https://betkyo.com/en/blog/risk-of-ruin/" rel="noopener noreferrer"&gt;Risk of ruin&lt;/a&gt; gives the general formula for how long any fixed-stake plan lasts against a 1% edge.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One practical detail from the demo settlement: the payout is stake × target floored to the cent, so a stake of 0.37 at ×1.23 pays 0.45, not 0.4551. On whole-unit stakes with a two-decimal target the product is already exact and nothing is lost; on small odd stakes the fraction of a cent is. Real-money rounds settle in the coin’s own precision.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Checking a round yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Before you play, the fairness panel shows the SHA-256 fingerprint of the server seed. Rotate your seed pair afterwards to reveal the seed itself and confirm the fingerprint.&lt;/li&gt;
&lt;li&gt;Compute HMAC-SHA256 with the server seed as the key and “clientSeed-nonce-0” as the message; the limbo round uses cursor 0.&lt;/li&gt;
&lt;li&gt;Take the first eight bytes of the digest as hi ÷ 2³² + lo ÷ 2⁶⁴ to get u, then floor(0.99 ÷ (1 − u) × 100), clamped to 100–1,000,000. That is the outcome in hundredths, and it should match the round to the last digit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The open-source verifier does the three steps in one command, &lt;code&gt;betkyo-verify limbo &amp;lt;serverSeed&amp;gt; &amp;lt;clientSeed&amp;gt; &amp;lt;nonce&amp;gt;&lt;/code&gt;, and prints the outcome in hundredths. If it matches the round you were paid on, the number was fixed before you typed your target — which is what a commitment proves, and all it proves; &lt;a href="https://betkyo.com/en/blog/what-a-hash-commitment-proves/" rel="noopener noreferrer"&gt;what a hash commitment proves&lt;/a&gt; draws that line carefully.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What are the odds of winning in limbo?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On this engine, 99 divided by your target: 49.50% at ×2, 9.90% at ×10, 0.99% at ×100 and 0.0099% (one in 10,101) at the ×10,000 cap. The formula is exact because the drawn number is floor(99 ÷ (1 − u)) and the target is a whole number of hundredths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the house edge in limbo?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.00% at every target. The win chance is 99 ÷ target and the payout is the target, so every bet returns 99.00% of the stake on average. No target multiplier is better value than another; a higher target only makes the results swing more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the best target multiplier for limbo?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is no better target in expectation — all of them cost 1% per unit staked. Low targets like ×1.10 or ×1.50 pay small amounts often; high targets pay rarely and big. Choose by how much variance you want, not by value, and remember that at ×100 you have a 37% chance of no win at all in 100 rounds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How often does limbo crash at 1.00?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.98% of rounds, about one in fifty. The formula starts at 0.99 ÷ (1 − u), so the lowest 1.98% of draws produce a number below ×1.01, and no target can win on those rounds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is ×2 in limbo a 50/50 bet?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not quite: 49.50%. The exact 50% point is ×1.98, which is the median outcome. The half-point gap between ×1.98 and ×2.00 is the house edge at that target.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the rounding in the formula cost the player anything?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. The floor in floor(99 ÷ (1 − u)) only decides the two decimals shown; because targets are whole hundredths, floor(x) ≥ T exactly when x ≥ T, so the win chance is 99 ÷ target without any rounding loss. The demo payout is floored to the cent, which matters only on small odd stakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Betkyo engine source: curve100() and u64() in _shared/rng.ts (outcome = floor(0.99 ÷ (1 − u) × 100) clamped to 100–1,000,000; u from the first eight digest bytes); demoLimboBet() in _shared/demoLocal.ts (cursor 0, win = outcome100 ≥ target100, payout floored to cents); target range and the 99 ÷ target win-chance display in limbo/limboGame.tsx&lt;/li&gt;
&lt;li&gt;Exact calculations written for this article: win chance 99 ÷ T for every target, the outcome distribution 0.99 ÷ x, per-round standard deviation and at-least-one-win probabilities; cross-checked by replaying 400,000 rounds of the engine’s HMAC stream through curve100() (×10: 9.86% simulated vs 9.90% exact; below ×1.01: 1.97% vs 1.98%)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/betkyo-open-labs/provably-fair-verifier" rel="noopener noreferrer"&gt;Betkyo provably-fair verifier (GitHub, MIT): the limbo command reproduces the outcome from serverSeed, clientSeed and nonce&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>math</category>
      <category>probability</category>
      <category>statistics</category>
    </item>
    <item>
      <title>Keno odds, priced: the chance of every hit count from one pick to ten</title>
      <dc:creator>Betkyo Research</dc:creator>
      <pubDate>Fri, 18 Sep 2026 02:17:14 +0000</pubDate>
      <link>https://dev.to/betkyo/keno-odds-priced-the-chance-of-every-hit-count-from-one-pick-to-ten-2716</link>
      <guid>https://dev.to/betkyo/keno-odds-priced-the-chance-of-every-hit-count-from-one-pick-to-ten-2716</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published in the &lt;a href="https://betkyo.com/en/blog/keno-odds-priced-the-chance-of-every-hit-count-from-one-pick-to-ten/" rel="noopener noreferrer"&gt;Betkyo Journal&lt;/a&gt;. Drafted with AI assistance; every figure was checked against the game engine source and approved by a human editor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Forty numbers, ten drawn, up to ten marked. That is the whole of keno’s probability, and it can be computed to the last digit for every ticket you can buy. We priced all fifty-five hit counts from the engine’s draw loop and its forty payout tables: how many hits to expect, how rare a clean sweep is, and what the ×1,000 cell is actually worth.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick answer:&lt;/strong&gt; On this engine’s keno — &lt;strong&gt;40 numbers, 10 drawn without replacement, up to 10 picks&lt;/strong&gt; — the chance of any hit count depends only on how many numbers you mark, never on which ones or which risk level. &lt;strong&gt;You hit one quarter of your picks on average&lt;/strong&gt;: a ten-pick ticket averages 2.5 hits and lands on exactly two 31.07% of the time. Missing everything runs from &lt;strong&gt;75.00% with one pick to 3.54% with ten&lt;/strong&gt;. Hitting every number you marked is &lt;strong&gt;1 in 4 for one pick, 1 in 2,611 for five, 1 in 18,278 for six and 1 in 847,660,528 for ten&lt;/strong&gt;. The ×1,000 top cell on a ten-pick ticket is therefore worth &lt;strong&gt;0.00012% of the stake&lt;/strong&gt; — about one ten-thousandth of one percent — and the other 99% of the return is paid out of the ordinary hit counts. All forty payout tables return between &lt;strong&gt;98.65% and 99.07%&lt;/strong&gt;; the risk level moves how often a ticket beats its stake (from 1.21% to 79.58%), not the odds of hitting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The board, the draw, and the one formula
&lt;/h2&gt;

&lt;p&gt;Keno is a lottery with the ticket price and the prize table printed on the same screen. The board has forty numbers. You mark between one and ten of them. The game draws ten balls, none of them twice, and pays according to how many of your marks were drawn. There is no decision after the draw begins and no card to hold, which means the whole game reduces to one question with an exact answer: given k marks, how likely is each number of hits?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Verified in the engine:&lt;/strong&gt; keno/kenoGame.tsx: BALLS = 40 and MAX_PICKS = 10; the board renders numbers 1 to 40 and refuses an eleventh pick. kenoDraws() in _shared/demoLocal.ts builds a pool of 40, then ten times in a row hashes the chain link, takes floor(norm × last), capped at last − 1, for the shrinking pool size &lt;code&gt;last = 40 − i&lt;/code&gt;, pushes that ball and swaps it out of the pool — ten balls, no repeats. demoKenoBet() counts hits as the picks contained in the draw set and looks the multiplier up as KENO_PAYTABLE[level][picks.length][hits.length].&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ten balls from forty without replacement is the hypergeometric distribution, the same arithmetic as a lottery draw. With k numbers marked, the chance of exactly h hits is C(k, h) × C(40 − k, 10 − h) ÷ C(40, 10). The denominator is the number of distinct ten-ball draws, 847,660,528, and every one of them is equally likely. Nothing in that formula mentions the risk level, and nothing in it mentions which numbers you chose. Every table below is that formula evaluated for every ticket the board allows, then cross-checked by replaying the engine’s own draw loop two million times.&lt;/p&gt;

&lt;h2&gt;
  
  
  The chart: every hit count for every pick count
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Chance of exactly h hits with k picks — 40 numbers, 10 drawn&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PICKS&lt;/th&gt;
&lt;th&gt;0 HITS&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;5&lt;/th&gt;
&lt;th&gt;6&lt;/th&gt;
&lt;th&gt;7&lt;/th&gt;
&lt;th&gt;8&lt;/th&gt;
&lt;th&gt;9&lt;/th&gt;
&lt;th&gt;10&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;75.00%&lt;/td&gt;
&lt;td&gt;25.00%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;55.77%&lt;/td&gt;
&lt;td&gt;38.46%&lt;/td&gt;
&lt;td&gt;5.77%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;41.09%&lt;/td&gt;
&lt;td&gt;44.03%&lt;/td&gt;
&lt;td&gt;13.66%&lt;/td&gt;
&lt;td&gt;1.21%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;29.99%&lt;/td&gt;
&lt;td&gt;44.42%&lt;/td&gt;
&lt;td&gt;21.42%&lt;/td&gt;
&lt;td&gt;3.94%&lt;/td&gt;
&lt;td&gt;0.23%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;21.66%&lt;/td&gt;
&lt;td&gt;41.65%&lt;/td&gt;
&lt;td&gt;27.77%&lt;/td&gt;
&lt;td&gt;7.93%&lt;/td&gt;
&lt;td&gt;0.96%&lt;/td&gt;
&lt;td&gt;0.038%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;15.47%&lt;/td&gt;
&lt;td&gt;37.13%&lt;/td&gt;
&lt;td&gt;32.13%&lt;/td&gt;
&lt;td&gt;12.69%&lt;/td&gt;
&lt;td&gt;2.38%&lt;/td&gt;
&lt;td&gt;0.20%&lt;/td&gt;
&lt;td&gt;0.0055%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;10.92%&lt;/td&gt;
&lt;td&gt;31.85%&lt;/td&gt;
&lt;td&gt;34.40%&lt;/td&gt;
&lt;td&gt;17.64%&lt;/td&gt;
&lt;td&gt;4.57%&lt;/td&gt;
&lt;td&gt;0.59%&lt;/td&gt;
&lt;td&gt;0.034%&lt;/td&gt;
&lt;td&gt;0.00064%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;7.61%&lt;/td&gt;
&lt;td&gt;26.47%&lt;/td&gt;
&lt;td&gt;34.74%&lt;/td&gt;
&lt;td&gt;22.24%&lt;/td&gt;
&lt;td&gt;7.48%&lt;/td&gt;
&lt;td&gt;1.33%&lt;/td&gt;
&lt;td&gt;0.12%&lt;/td&gt;
&lt;td&gt;0.0047%&lt;/td&gt;
&lt;td&gt;1 in 1,708,993&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;5.23%&lt;/td&gt;
&lt;td&gt;21.40%&lt;/td&gt;
&lt;td&gt;33.50%&lt;/td&gt;
&lt;td&gt;26.06%&lt;/td&gt;
&lt;td&gt;10.94%&lt;/td&gt;
&lt;td&gt;2.53%&lt;/td&gt;
&lt;td&gt;0.31%&lt;/td&gt;
&lt;td&gt;0.019%&lt;/td&gt;
&lt;td&gt;0.00049%&lt;/td&gt;
&lt;td&gt;1 in 27,343,888&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;3.54%&lt;/td&gt;
&lt;td&gt;16.88%&lt;/td&gt;
&lt;td&gt;31.07%&lt;/td&gt;
&lt;td&gt;28.82%&lt;/td&gt;
&lt;td&gt;14.71%&lt;/td&gt;
&lt;td&gt;4.24%&lt;/td&gt;
&lt;td&gt;0.68%&lt;/td&gt;
&lt;td&gt;0.057%&lt;/td&gt;
&lt;td&gt;0.0023%&lt;/td&gt;
&lt;td&gt;1 in 2,825,535&lt;/td&gt;
&lt;td&gt;1 in 847,660,528&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Exact hypergeometric probabilities; each cell is an integer count of draws divided by C(40, 10) = 847,660,528. Cells below one in a million are shown as odds. Rows sum to 100%.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read down any column and the shape is the same story told ten times. Marking more numbers shifts the weight to the right — more hits on average — but the top of every row thins out faster than the row lengthens. Two hits is the most likely result for anyone marking seven or more; one hit for three to six; and with one or two picks the most likely outcome is nothing at all.&lt;/p&gt;

&lt;p&gt;The number worth memorising is the average. Ten of forty numbers are drawn, so each mark has exactly a one-in-four chance of being hit, and a k-pick ticket averages k ÷ 4 hits whatever else is true about it. Ten picks average 2.5 hits; four picks average one. The payout tables are all built around that average, and each one decides what to do with the ticket that lands on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each pick count promises
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;The shape of a ticket by number of picks&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PICKS&lt;/th&gt;
&lt;th&gt;AVERAGE HITS&lt;/th&gt;
&lt;th&gt;MOST LIKELY&lt;/th&gt;
&lt;th&gt;NO HITS&lt;/th&gt;
&lt;th&gt;AT LEAST ONE&lt;/th&gt;
&lt;th&gt;EVERY PICK HITS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;0 (75.00%)&lt;/td&gt;
&lt;td&gt;75.00%&lt;/td&gt;
&lt;td&gt;25.00%&lt;/td&gt;
&lt;td&gt;1 in 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;0 (55.77%)&lt;/td&gt;
&lt;td&gt;55.77%&lt;/td&gt;
&lt;td&gt;44.23%&lt;/td&gt;
&lt;td&gt;1 in 17.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;1 (44.03%)&lt;/td&gt;
&lt;td&gt;41.09%&lt;/td&gt;
&lt;td&gt;58.91%&lt;/td&gt;
&lt;td&gt;1 in 82.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;1 (44.42%)&lt;/td&gt;
&lt;td&gt;29.99%&lt;/td&gt;
&lt;td&gt;70.01%&lt;/td&gt;
&lt;td&gt;1 in 435&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1.25&lt;/td&gt;
&lt;td&gt;1 (41.65%)&lt;/td&gt;
&lt;td&gt;21.66%&lt;/td&gt;
&lt;td&gt;78.34%&lt;/td&gt;
&lt;td&gt;1 in 2,611&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;1.50&lt;/td&gt;
&lt;td&gt;1 (37.13%)&lt;/td&gt;
&lt;td&gt;15.47%&lt;/td&gt;
&lt;td&gt;84.53%&lt;/td&gt;
&lt;td&gt;1 in 18,278&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;1.75&lt;/td&gt;
&lt;td&gt;2 (34.40%)&lt;/td&gt;
&lt;td&gt;10.92%&lt;/td&gt;
&lt;td&gt;89.08%&lt;/td&gt;
&lt;td&gt;1 in 155,363&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;td&gt;2 (34.74%)&lt;/td&gt;
&lt;td&gt;7.61%&lt;/td&gt;
&lt;td&gt;92.39%&lt;/td&gt;
&lt;td&gt;1 in 1,708,993&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;2.25&lt;/td&gt;
&lt;td&gt;2 (33.50%)&lt;/td&gt;
&lt;td&gt;5.23%&lt;/td&gt;
&lt;td&gt;94.77%&lt;/td&gt;
&lt;td&gt;1 in 27,343,888&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2.50&lt;/td&gt;
&lt;td&gt;2 (31.07%)&lt;/td&gt;
&lt;td&gt;3.54%&lt;/td&gt;
&lt;td&gt;96.46%&lt;/td&gt;
&lt;td&gt;1 in 847,660,528&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Average hits is exactly picks ÷ 4. “At least one” is the chance the ticket touches the draw at all, which is not the same as the chance it pays — that depends on the level, below.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A ten-pick ticket almost always hits something: only one in twenty-eight comes back with nothing. That feels like a generous game, and the payout tables are where the feeling is corrected. A ten-pick ticket pays nothing below two hits on Low, below three on Classic and Medium, and below four on High, and those unpaid hit counts are the ones the chart says are common. Hitting something and being paid for it are different events, and the gap between them is how a keno table is tuned.&lt;/p&gt;

&lt;p&gt;The last column is the one people search for. A clean sweep — every marked number drawn — is a one-in-four event with a single pick and becomes astronomically rare by ten. Each extra pick multiplies the odds against by a growing factor: the fourth pick roughly quintuples them, the tenth multiplies them by thirty-one. Five for five happens once in 2,611 tickets; eight for eight once in 1.7 million; ten for ten once in 847,660,528. The draw does not know it is being asked for a sweep, so no choice of numbers, level or timing changes any of those figures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hitting them all, and what the engine pays for it
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;The all-hit cell: its true odds against its multiplier on each level&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PICKS&lt;/th&gt;
&lt;th&gt;ODDS OF ALL HITS&lt;/th&gt;
&lt;th&gt;FAIR MULTIPLIER&lt;/th&gt;
&lt;th&gt;CLASSIC PAYS&lt;/th&gt;
&lt;th&gt;LOW&lt;/th&gt;
&lt;th&gt;MEDIUM&lt;/th&gt;
&lt;th&gt;HIGH&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 in 4&lt;/td&gt;
&lt;td&gt;×4&lt;/td&gt;
&lt;td&gt;×3.96&lt;/td&gt;
&lt;td&gt;×1.85&lt;/td&gt;
&lt;td&gt;×2.75&lt;/td&gt;
&lt;td&gt;×3.96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1 in 17.3&lt;/td&gt;
&lt;td&gt;×17.3&lt;/td&gt;
&lt;td&gt;×4.50&lt;/td&gt;
&lt;td&gt;×3.80&lt;/td&gt;
&lt;td&gt;×5.10&lt;/td&gt;
&lt;td&gt;×17.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1 in 82.3&lt;/td&gt;
&lt;td&gt;×82.3&lt;/td&gt;
&lt;td&gt;×10.40&lt;/td&gt;
&lt;td&gt;×26&lt;/td&gt;
&lt;td&gt;×50&lt;/td&gt;
&lt;td&gt;×81.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1 in 435&lt;/td&gt;
&lt;td&gt;×435&lt;/td&gt;
&lt;td&gt;×22.50&lt;/td&gt;
&lt;td&gt;×90&lt;/td&gt;
&lt;td&gt;×100&lt;/td&gt;
&lt;td&gt;×259&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1 in 2,611&lt;/td&gt;
&lt;td&gt;×2,611&lt;/td&gt;
&lt;td&gt;×36&lt;/td&gt;
&lt;td&gt;×300&lt;/td&gt;
&lt;td&gt;×390&lt;/td&gt;
&lt;td&gt;×450&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;1 in 18,278&lt;/td&gt;
&lt;td&gt;×18,278&lt;/td&gt;
&lt;td&gt;×40&lt;/td&gt;
&lt;td&gt;×700&lt;/td&gt;
&lt;td&gt;×710&lt;/td&gt;
&lt;td&gt;×710&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;1 in 155,363&lt;/td&gt;
&lt;td&gt;×155,363&lt;/td&gt;
&lt;td&gt;×60&lt;/td&gt;
&lt;td&gt;×700&lt;/td&gt;
&lt;td&gt;×800&lt;/td&gt;
&lt;td&gt;×800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;1 in 1,708,993&lt;/td&gt;
&lt;td&gt;×1,708,993&lt;/td&gt;
&lt;td&gt;×70&lt;/td&gt;
&lt;td&gt;×800&lt;/td&gt;
&lt;td&gt;×900&lt;/td&gt;
&lt;td&gt;×900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;1 in 27,343,888&lt;/td&gt;
&lt;td&gt;×27,343,888&lt;/td&gt;
&lt;td&gt;×85&lt;/td&gt;
&lt;td&gt;×1,000&lt;/td&gt;
&lt;td&gt;×1,000&lt;/td&gt;
&lt;td&gt;×1,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;1 in 847,660,528&lt;/td&gt;
&lt;td&gt;×847,660,528&lt;/td&gt;
&lt;td&gt;×100&lt;/td&gt;
&lt;td&gt;×1,000&lt;/td&gt;
&lt;td&gt;×1,000&lt;/td&gt;
&lt;td&gt;×1,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Fair multiplier is 1 ÷ probability — what the all-hit cell would pay if it carried the whole return by itself. The gap to the paid multiplier is not the house edge; it is the return that the table pays out on lower hit counts instead.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Verified in the engine:&lt;/strong&gt; KENO_PAYTABLE in keno/paytable.ts, which mirrors the TB_KENO_PROB rows the server pays from: the top cell of each row is 3.96, 4.50, 10.40, 22.50, 36, 40, 60, 70, 85 and 100 on CLASSIC; 1.85, 3.80, 26, 90, 300, 700, 700, 800, 1000 and 1000 on LOW; 2.75, 5.10, 50, 100, 390, 710, 800, 900, 1000 and 1000 on MEDIUM; 3.96, 17.10, 81.50, 259, 450, 710, 800, 900, 1000 and 1000 on HIGH. The demo settlement multiplies the stake by that cell and floors the result to cents.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;High with one, two or three picks is the cleanest reading of this table, because on those rows the all-hit cell is the only cell that pays. There the multiplier is the whole return: ×3.96 against a fair ×4 is 99.00%, ×17.10 against ×17.33 is 98.65%, ×81.50 against ×82.33 is 98.99%. That is the house edge, expressed as a discount on the one prize.&lt;/p&gt;

&lt;p&gt;Every other row pays the sweep at a fraction of its fair price, and the fraction shrinks fast. Five for five is worth ×2,611 at fair odds and pays ×450 on High, because the three- and four-hit cells on that row are paid the rest. By ten picks the ×1,000 cell is paid at about one 850,000th of its fair value, and its contribution to the ticket’s return is 1,000 ÷ 847,660,528 — 0.00012% of the stake. On a one-dollar ticket the largest number on the keno screen is worth about a ten-thousandth of a cent. The other 99% of the return is in the cells the chart calls ordinary.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a ticket beats its stake
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Chance a ticket returns more than it cost, by picks and level&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PICKS&lt;/th&gt;
&lt;th&gt;CLASSIC&lt;/th&gt;
&lt;th&gt;LOW&lt;/th&gt;
&lt;th&gt;MEDIUM&lt;/th&gt;
&lt;th&gt;HIGH&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;25.00%&lt;/td&gt;
&lt;td&gt;25.00%&lt;/td&gt;
&lt;td&gt;25.00%&lt;/td&gt;
&lt;td&gt;25.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;44.23%&lt;/td&gt;
&lt;td&gt;44.23%&lt;/td&gt;
&lt;td&gt;44.23%&lt;/td&gt;
&lt;td&gt;5.77%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;14.88%&lt;/td&gt;
&lt;td&gt;58.91%&lt;/td&gt;
&lt;td&gt;14.88%&lt;/td&gt;
&lt;td&gt;1.21%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;25.59%&lt;/td&gt;
&lt;td&gt;25.59%&lt;/td&gt;
&lt;td&gt;25.59%&lt;/td&gt;
&lt;td&gt;4.17%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;36.69%&lt;/td&gt;
&lt;td&gt;36.69%&lt;/td&gt;
&lt;td&gt;36.69%&lt;/td&gt;
&lt;td&gt;8.93%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;15.28%&lt;/td&gt;
&lt;td&gt;47.40%&lt;/td&gt;
&lt;td&gt;15.28%&lt;/td&gt;
&lt;td&gt;2.58%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;22.83%&lt;/td&gt;
&lt;td&gt;57.23%&lt;/td&gt;
&lt;td&gt;22.83%&lt;/td&gt;
&lt;td&gt;5.20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;31.17%&lt;/td&gt;
&lt;td&gt;65.92%&lt;/td&gt;
&lt;td&gt;31.17%&lt;/td&gt;
&lt;td&gt;8.94%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;39.86%&lt;/td&gt;
&lt;td&gt;39.86%&lt;/td&gt;
&lt;td&gt;39.86%&lt;/td&gt;
&lt;td&gt;13.80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;48.51%&lt;/td&gt;
&lt;td&gt;79.58%&lt;/td&gt;
&lt;td&gt;48.51%&lt;/td&gt;
&lt;td&gt;19.69%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Counts only cells paying more than ×1. Cells that return part or all of the stake — Classic’s two ×1.00 cells (three picks with one hit, six picks with two), its ×0.80, ×0.25 and ×0.47 cells, Low’s ×0.70 and Medium’s ×0.40 with one pick and no hits — are excluded. Every figure is a hit-count probability from the chart above.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Expected return of each of the forty payout tables&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PICKS&lt;/th&gt;
&lt;th&gt;CLASSIC&lt;/th&gt;
&lt;th&gt;LOW&lt;/th&gt;
&lt;th&gt;MEDIUM&lt;/th&gt;
&lt;th&gt;HIGH&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;98.75%&lt;/td&gt;
&lt;td&gt;98.75%&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;99.04%&lt;/td&gt;
&lt;td&gt;98.85%&lt;/td&gt;
&lt;td&gt;98.65%&lt;/td&gt;
&lt;td&gt;98.65%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;99.02%&lt;/td&gt;
&lt;td&gt;98.87%&lt;/td&gt;
&lt;td&gt;98.99%&lt;/td&gt;
&lt;td&gt;98.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;98.96%&lt;/td&gt;
&lt;td&gt;98.92%&lt;/td&gt;
&lt;td&gt;98.78%&lt;/td&gt;
&lt;td&gt;98.91%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;98.99%&lt;/td&gt;
&lt;td&gt;98.90%&lt;/td&gt;
&lt;td&gt;98.94%&lt;/td&gt;
&lt;td&gt;98.89%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;98.97%&lt;/td&gt;
&lt;td&gt;99.01%&lt;/td&gt;
&lt;td&gt;98.83%&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;98.98%&lt;/td&gt;
&lt;td&gt;98.94%&lt;/td&gt;
&lt;td&gt;98.96%&lt;/td&gt;
&lt;td&gt;98.96%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;99.02%&lt;/td&gt;
&lt;td&gt;99.00%&lt;/td&gt;
&lt;td&gt;98.92%&lt;/td&gt;
&lt;td&gt;98.96%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;98.98%&lt;/td&gt;
&lt;td&gt;99.07%&lt;/td&gt;
&lt;td&gt;98.94%&lt;/td&gt;
&lt;td&gt;98.96%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;99.04%&lt;/td&gt;
&lt;td&gt;98.76%&lt;/td&gt;
&lt;td&gt;98.97%&lt;/td&gt;
&lt;td&gt;99.01%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Each cell of KENO_PAYTABLE multiplied by its hit-count probability and summed. Forty tables, all within 0.42 points: the lowest is 98.65% (Medium and High at two picks), the highest 99.07% (Low at nine).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The two tables together are the whole product. The first one moves by a factor of sixty-five — Low with ten picks beats its stake on four tickets in five, High with three picks on one in eighty-three — and the second barely moves at all. Nothing you can select on the keno screen changes what a ticket is worth by more than half a point. What the selections change is how that value arrives: as a stream of small returns or as a rare large one. &lt;a href="https://betkyo.com/en/blog/what-a-keno-risk-level-changes/" rel="noopener noreferrer"&gt;What a keno risk level changes&lt;/a&gt; takes that trade-off apart in detail; the chart above is the fixed input every one of those tables is built on.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every ticket is a fresh draw from the same 847,660,528 combinations. A number that has not come up for an hour is exactly as likely as one that came up three times in a row, and a ticket that just missed by one is no closer to hitting next time — see &lt;a href="https://betkyo.com/en/blog/gamblers-fallacy/" rel="noopener noreferrer"&gt;the gambler’s fallacy&lt;/a&gt;. The demo draw commits a hash chain and salt before the balls fall and reveals them afterwards, so any single draw can be recomputed from the ticket.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What are the odds of hitting all 10 numbers in keno?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One in 847,660,528 on a 40-number board with 10 balls drawn — that is C(40, 10), the number of distinct draws, and exactly one of them matches a ten-pick ticket. On this engine that cell pays ×1,000 on Low, Medium and High and ×100 on Classic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are the odds of hitting 5 out of 5 in keno?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One in 2,611 (0.038%). Four of five hits happens 0.96% of the time and three of five 7.93%. The engine pays five for five at ×36 on Classic, ×300 on Low, ×390 on Medium and ×450 on High.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many numbers should I pick in keno?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The return is within half a point across every pick count and level (98.65% to 99.07%), so no pick count is better value. More picks means more hits on average — exactly one quarter of the marks — but the table demands more hits before it pays. Fewer picks means a simpler ticket that either hits or does not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many numbers will I hit on average?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A quarter of the numbers you mark, because 10 of the 40 are drawn. Ten picks average 2.5 hits and land on exactly two 31.07% of the time; four picks average one hit. Missing everything runs from 75.00% with one pick down to 3.54% with ten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does picking the same numbers every game improve my odds?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Every ten-ball draw is equally likely and independent of the last, so no set of numbers is due or cold. The odds of any hit count depend only on how many numbers you mark, and those odds are the chart in this article.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the ×1,000 keno prize worth chasing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is worth 0.00012% of the stake on a ten-pick ticket — ×1,000 multiplied by a one-in-847,660,528 chance. Almost all of the ticket’s 99% return is paid on ordinary hit counts, and on High nothing below four hits pays at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Betkyo engine source: BALLS = 40 and MAX_PICKS = 10 in keno/kenoGame.tsx; kenoDraws() and demoKenoBet() in _shared/demoLocal.ts (ten balls from a forty-number pool without replacement, hits counted against the draw set, multiplier looked up by pick count and hit count, floored to cents)&lt;/li&gt;
&lt;li&gt;Betkyo engine source: KENO_PAYTABLE in keno/paytable.ts — all forty payout tables, mirrored from the TB_KENO_PROB rows the server pays from&lt;/li&gt;
&lt;li&gt;Exact calculations written for this article: the hypergeometric distribution C(k, h) × C(40 − k, 10 − h) ÷ C(40, 10) for every pick and hit count, per-table returns and beat-the-stake probabilities from those cells, and a two-million-ticket replay of the engine’s swap-pool draw as a cross-check&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>math</category>
      <category>probability</category>
      <category>statistics</category>
    </item>
    <item>
      <title>Uston v. Resorts: the 1982 ruling that a casino cannot bar a card counter</title>
      <dc:creator>Betkyo Research</dc:creator>
      <pubDate>Thu, 17 Sep 2026 01:47:08 +0000</pubDate>
      <link>https://dev.to/betkyo/uston-v-resorts-the-1982-ruling-that-a-casino-cannot-bar-a-card-counter-6b6</link>
      <guid>https://dev.to/betkyo/uston-v-resorts-the-1982-ruling-that-a-casino-cannot-bar-a-card-counter-6b6</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published in the &lt;a href="https://betkyo.com/en/blog/uston-v-resorts-the-1982-ruling-that-a-casino-cannot-bar-a-card-counter/" rel="noopener noreferrer"&gt;Betkyo Journal&lt;/a&gt;. Drafted with AI assistance; every date and citation was checked against the sources listed at the end and approved by a human editor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;On 30 January 1979 Atlantic City’s only casino barred the best-known card counter in America from its blackjack tables. Three years and three courts later the New Jersey Supreme Court told it that the rules of the game belonged to the state, not the house, and that a player who followed them could not be shown the door for being good at them. The house did not lose the war. It got the rules changed instead.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick answer:&lt;/strong&gt; In &lt;strong&gt;Uston v. Resorts International Hotel, Inc.&lt;/strong&gt;, 89 N.J. 163, decided &lt;strong&gt;5 May 1982&lt;/strong&gt;, the New Jersey Supreme Court held unanimously that an Atlantic City casino could not exclude &lt;strong&gt;Kenneth Uston&lt;/strong&gt; for &lt;strong&gt;card counting&lt;/strong&gt;. The Casino Control Act gave the state’s Casino Control Commission exclusive authority over the rules of every licensed game, and Uston had broken none of them; in the court’s words, the Commission “has promulgated the blackjack rules that give Uston a comparative advantage, and it has sole authority to change those rules.” The same man had already lost in Nevada, where federal courts in &lt;strong&gt;1977&lt;/strong&gt; and &lt;strong&gt;1978&lt;/strong&gt; found no legal duty on a private casino to let him play. New Jersey answered its own ruling within weeks: the Commission adopted regulations in &lt;strong&gt;June and August 1982&lt;/strong&gt; letting casinos shuffle after any round, use more decks and run continuous-shuffling shoes, and in &lt;strong&gt;1991&lt;/strong&gt; let them change table limits at any time. A counter could no longer be barred in New Jersey; the shoe he was counting could be shuffled the moment it turned in his favour. On an infinite-shoe engine there is no shoe to shuffle: every blackjack card is an independent draw of floor(u × 52) from a committed seed, so counting has nothing to count and the house needs no countermeasure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Losing in Nevada first
&lt;/h2&gt;

&lt;p&gt;Kenneth Uston was not a professional gambler by training. Born in New York in 1935, he went to Yale at sixteen, took an MBA at Harvard and rose to senior vice-president of the Pacific Stock Exchange in San Francisco before blackjack took over. By the mid-1970s he was running counting teams in Las Vegas on the model &lt;a href="https://betkyo.com/en/blog/mit-blackjack-team/" rel="noopener noreferrer"&gt;Edward Thorp’s arithmetic had made possible&lt;/a&gt;, and in 1977 he described the method in The Big Player, written with Roger Rapoport. The casinos read the book too. Being recognised became the main occupational hazard of the job.&lt;/p&gt;

&lt;p&gt;On 29 June 1975 he sat down at the Flamingo Hilton and was escorted out under Nevada’s trespass statute. He sued, in federal court, on the theory that a casino so thoroughly licensed and regulated by the state was acting for the state when it threw him out, and that the state could not treat one lawful player differently from another. The theory failed twice. In Uston v. Airport Casino, decided by the Ninth Circuit on 24 May 1977 over his exclusion from the Marina casino “solely because he is a competent blackjack player”, the court found no state action in the casino’s decision. In Uston v. Hilton Hotels Corp., decided by the federal district court in Nevada in 1978, Chief Judge Foley held that the state’s gaming statute imposed no obligation on Nevada to compel a casino to admit a person it believed to be a card counter.&lt;/p&gt;

&lt;p&gt;That is still the law in Nevada and in most of the United States. A casino is private property open to the public, and the traditional American rule lets the owner of such a place exclude anyone for any reason short of the ones civil rights statutes forbid. Skill at the owner’s own game is not one of those reasons. What made New Jersey different was not a kinder view of card counters but a different statute, and a different idea about who owned the rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  30 January 1979
&lt;/h2&gt;

&lt;p&gt;Resorts International opened on the Atlantic City boardwalk on 26 May 1978, the first legal casino in the United States outside Nevada, and for more than a year it was the only one. Uston moved east and began playing there in November 1978. On 5 January 1979 a new Casino Control Commission rule for blackjack took effect; contemporary reporting described it as allowing the cards to be shuffled only once per shoe, which is exactly the condition a counter wants, since the count is worth most deep in a shoe that has not been reshuffled. On 30 January 1979 Resorts barred him from its blackjack tables. He was not accused of cheating, of using a device or of disturbing anyone. The stated reason was that his way of playing increased his chances of winning.&lt;/p&gt;

&lt;p&gt;Uston complained to the Commission, which sided with the casino: Resorts, it held, had a common-law right to exclude any patron for any reason. In December 1979 the Commission and the casinos tried the alternative as an experiment, admitting counters to the tables for a trial period. According to the wire reports of the time the trial was cut short after teams of counters won about $1.4 million. The number did nothing to soften the casinos’ view, and the case went up on appeal.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The litigation, 1975–1982&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;DATE&lt;/th&gt;
&lt;th&gt;COURT&lt;/th&gt;
&lt;th&gt;WHAT HAPPENED&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;29 June 1975&lt;/td&gt;
&lt;td&gt;Flamingo Hilton, Las Vegas&lt;/td&gt;
&lt;td&gt;Uston escorted from the blackjack tables under the trespass statute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24 May 1977&lt;/td&gt;
&lt;td&gt;US Court of Appeals, Ninth Circuit&lt;/td&gt;
&lt;td&gt;Uston v. Airport Casino: no state action in a Nevada casino excluding a “competent blackjack player”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1978&lt;/td&gt;
&lt;td&gt;US District Court, Nevada&lt;/td&gt;
&lt;td&gt;Uston v. Hilton Hotels: Nevada law imposes no duty to admit a suspected counter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30 January 1979&lt;/td&gt;
&lt;td&gt;Resorts International, Atlantic City&lt;/td&gt;
&lt;td&gt;Uston barred from blackjack; the Casino Control Commission upholds the casino&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;December 1979&lt;/td&gt;
&lt;td&gt;Casino Control Commission&lt;/td&gt;
&lt;td&gt;Trial period admitting counters, ended after reported team wins of about $1.4 million&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11 May 1981&lt;/td&gt;
&lt;td&gt;NJ Superior Court, Appellate Division&lt;/td&gt;
&lt;td&gt;Reverses the Commission: a casino “is not empowered to so blacklist and exclude a person”; stayed pending appeal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 May 1982&lt;/td&gt;
&lt;td&gt;New Jersey Supreme Court&lt;/td&gt;
&lt;td&gt;Affirms, unanimously: only the Commission can change the rules Uston was playing by&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Appellate Division ruled on 11 May 1981, after argument on 9 March, that the power to blacklist a patron belonged to the Commission alone, and that Resorts had excluded Uston for his skill rather than for anything that made him an undesirable. The casino obtained a stay and took the case to the state’s highest court, which heard argument on 9 February 1982 and decided it on 5 May.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the court actually decided
&lt;/h2&gt;

&lt;p&gt;Justice Pashman’s opinion for a unanimous court rests on two legs, and the second is the one that mattered. The first is the common law. New Jersey had once followed the old English rule that a theatre could eject a ticket-holder for no reason at all, but the court had already moved away from it: in State v. Schmid, two years earlier, it had said that “the more private property is devoted to public use, the more it must accommodate the rights which inhere in individual members of the general public who use that property.” An owner who opens the doors to everyone keeps the right to remove the disorderly, the intoxicated and the dangerous. Uston, the court observed, “does not threaten the security of any casino occupant. Nor has he disrupted the functioning of any casino operations.”&lt;/p&gt;

&lt;p&gt;The second leg is the Casino Control Act. Section 100(e) of the Act says that all gaming shall be conducted according to rules promulgated by the Commission, and the Commission had written blackjack down in detail: the decks, the shuffle, the cut, the wagers, when a player may double or split. Uston had followed every one of those rules. If a casino could add a further, private rule that the game must not be played too well, the court reasoned, the state’s control of the game would be a fiction. As the opinion put it, the Commission “has promulgated the blackjack rules that give Uston a comparative advantage, and it has sole authority to change those rules.” Absent a valid contrary rule from the Commission, Uston “possesses the usual right of reasonable access to Resorts International’s blackjack tables.”&lt;/p&gt;

&lt;p&gt;Two things the court did not decide are as important as the one it did. It did not say that card counting was a right; it said the Commission had not exercised its authority on the question, and expressly left open whether a Commission rule excluding counters would be lawful. And it did not throw the tables open at once. A temporary order keeping Uston away from Resorts’ blackjack tables was continued for ninety days, which the court described as time for the Commission to act. Resorts’ spokesman told the wire services the casino was “disappointed but we believe there will be a fair resolution to the problem.” The resolution arrived on schedule.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The commission has promulgated the blackjack rules that give Uston a comparative advantage, and it has sole authority to change those rules.&lt;br&gt;
— Uston v. Resorts International Hotel, Inc., 89 N.J. 163 (1982), Pashman, J.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The countermeasures
&lt;/h2&gt;

&lt;p&gt;The Commission did not ban counters. It changed the game so that counting was worth less, which is what the court had all but invited it to do. Rule amendments published in the New Jersey Register on 7 June 1982 and adopted on 2 August 1982 rewrote the blackjack shuffle regulation, N.J.A.C. 19:47-2.5, so that the dealer shuffles “immediately prior to commencement of play, after any round of play as may be determined by the casino licensee and after each shoe of cards is dealt.” That phrase, “after any round of play as may be determined by the casino licensee”, is the shuffle-at-will rule. A pit boss who believes the shoe has turned rich in tens can order a shuffle before the next hand, and the count goes back to zero.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Countermeasures the Commission authorised after Uston&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MEASURE&lt;/th&gt;
&lt;th&gt;RULE&lt;/th&gt;
&lt;th&gt;WHEN&lt;/th&gt;
&lt;th&gt;WHAT IT DOES TO A COUNTER&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shuffle at will&lt;/td&gt;
&lt;td&gt;N.J.A.C. 19:47-2.5(a)&lt;/td&gt;
&lt;td&gt;1982 (14 N.J.R. 559, 841)&lt;/td&gt;
&lt;td&gt;The casino may reshuffle after any round, so a favourable shoe can be erased before it is bet on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bart Carter shuffle&lt;/td&gt;
&lt;td&gt;N.J.A.C. 19:47-2.1&lt;/td&gt;
&lt;td&gt;1982&lt;/td&gt;
&lt;td&gt;About a deck is shuffled back after being dealt and kept in separate stacks, blurring what has left the shoe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continuous shuffling shoe&lt;/td&gt;
&lt;td&gt;N.J.A.C. 19:47-2.21&lt;/td&gt;
&lt;td&gt;1982&lt;/td&gt;
&lt;td&gt;A device reshuffles automatically; there is never a depleted shoe to track&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;More decks&lt;/td&gt;
&lt;td&gt;N.J.A.C. 19:47-2.2&lt;/td&gt;
&lt;td&gt;1982&lt;/td&gt;
&lt;td&gt;A larger shoe dilutes the swing any run of low cards can produce&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limits changed at any time&lt;/td&gt;
&lt;td&gt;N.J.A.C. 19:47-8.3(c)&lt;/td&gt;
&lt;td&gt;1991 (23 N.J.R. 1784)&lt;/td&gt;
&lt;td&gt;A table’s minimum and maximum may be changed without notice to the Commission, so a counter can be held to small bets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Rule citations and Register references as recited by the Third Circuit in Doug Grant, Inc. v. Greate Bay Casino Corp. (2000) and the New Jersey Supreme Court in Campione v. Adamar (1998). Section numbers are those in force at the time; the blackjack rules have since been recodified.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each measure attacks the same thing, the memory of the shoe. Counting works only because cards dealt are cards gone, and a shoe short of low cards is a shoe rich in high ones. Shuffle earlier, shuffle more, or shuffle continuously, and the memory is shortened or removed. The extra decks work on the other side of the equation: the same run of small cards moves the composition of an eight-deck shoe far less than a single deck. None of it required the counter to leave. It required only that the thing he was counting stop being worth counting.&lt;/p&gt;

&lt;p&gt;The rules did not end the argument, they moved it. In 1991 Anthony Campione, a counter identified by TropWorld’s in-house card-counting team, was held to a $100 maximum at a table where other players were allowed $1,000 and restricted to one hand while others played several; he sued, a jury awarded him $1,519,873, and on 22 July 1998 the New Jersey Supreme Court held that a patron may bring a common-law discrimination claim against a casino in the ordinary courts, while leaving to the Commission the first word on what its own countermeasure regulations permit. In Doug Grant, Inc. v. Greate Bay Casino Corp., decided on 2 November 2000, a group of counters challenged the countermeasures themselves and lost; the Third Circuit’s answer was that “the normal chance and random character of any casino game is necessarily defined and determined by the rules governing the conduct of the game”, and the rules were the Commission’s to write. Uston himself did not see most of this. He died in Paris on 19 September 1987, at fifty-two.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Uston remains a minority rule. Outside New Jersey, American casinos generally retain the property owner’s right to refuse a card counter, and Nevada’s courts have never departed from the position they took in Uston’s own cases. Counting with one’s own memory is not a crime anywhere in the United States; being asked to leave for it is, in most places, not a wrong either.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A shoe with no memory
&lt;/h2&gt;

&lt;p&gt;It is worth being precise about why none of this, the ruling, the shuffle-at-will rule or the continuous shoe, has any bearing on an infinite-shoe blackjack engine, because the reason is structural rather than a matter of policy. The Commission’s countermeasures all shorten the memory of a physical shoe. An infinite-shoe engine deals from a shoe that has no memory to shorten.&lt;/p&gt;

&lt;p&gt;Every card in a round is derived separately. The client code takes the round’s committed server seed as an HMAC-SHA256 key, signs the message clientSeed-nonce-cursor, reads the first eight bytes of the digest as a number u between 0 and 1, and deals card floor(u × 52). The cursor is the position in the deal order: the player’s first card, the dealer’s up card, the player’s second card, the dealer’s hole card, then each further draw. Because the cursor changes and nothing else does, each card is an independent draw from all fifty-two with replacement. The ten you were just dealt does not make the next ten any less likely. A running count of what has been dealt carries no information about what comes next, which is exactly the property a dealt shoe lacks and a counter lives on.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Verified in the engine:&lt;/strong&gt; blackjack/derive.ts header: “Infinite shoe: card i = floor(u × 52) at cursor i, so every card of the round is a pure function of (seed pair, nonce, deal order).” deriveBjCard(serverSeed, clientSeed, nonce, cursor) returns Math.min(Math.floor(u × 52), 51) where u = u64(hmacSha256Utf8(serverSeed, &lt;code&gt;${clientSeed}-${nonce}-${cursor}&lt;/code&gt;)). Deal order per the same header: player1, dealer-up, player2, dealer-hole, then every further draw in play order. _shared/rng.ts: u64 reads the first eight bytes of the digest as hi/2^32 + lo/2^64.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A dealt shoe&lt;/strong&gt; has memory. Its composition drifts as cards leave it, the drift can be tracked, and the house’s defence is to shorten the memory: shuffle earlier, shuffle at will, shuffle continuously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An infinite shoe&lt;/strong&gt; has none. Each card is a fresh function of the seed pair and its cursor, so there is nothing to track and nothing for the house to reset. No shuffle-at-will rule exists here because no shuffle exists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The rules are the code.&lt;/strong&gt; In Atlantic City the rules of blackjack are a regulation that a player can read and the house cannot privately amend. In an open engine they are the derive module, published, with the basic strategy &lt;a href="https://betkyo.com/en/blog/blackjack-basic-strategy-chart-priced-on-an-infinite-shoe/" rel="noopener noreferrer"&gt;priced cell by cell against it&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uston won the right to play a game whose rules were written down by someone other than the house, and the house answered by asking that someone to rewrite them. A game whose rules are code has the same property in a stronger form: the rule that decides each card is fixed before the round, committed to by hash, and reproducible afterwards by anyone who cares to check. It also means there is no edge in it for a counter, and it is better to say that plainly than let anyone spend an evening looking for one.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What did Uston v. Resorts International decide?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On 5 May 1982 the New Jersey Supreme Court held that an Atlantic City casino could not exclude Kenneth Uston for card counting. The Casino Control Act gives the Casino Control Commission exclusive authority over the rules of licensed games, Uston had broken none of them, and only the Commission could change them. The court left open whether the Commission itself could adopt a rule excluding counters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why could Nevada casinos bar Uston but New Jersey casinos could not?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uston’s Nevada suits, decided in 1977 and 1978, failed because a private casino excluding a player is not the state acting, and Nevada law imposes no duty to admit a suspected counter. New Jersey’s Casino Control Act places every rule of play under the Commission, so a casino cannot add a private rule of its own. New Jersey’s position remains a minority rule in the United States.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How did the Casino Control Commission respond to the ruling?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With rule changes rather than a ban. Amendments published in June 1982 and adopted in August 1982 let casinos shuffle after any round, use the Bart Carter shuffle, install continuous-shuffling shoes and use more decks. In 1991 a further rule let a casino change a table’s minimum and maximum wager at any time without notifying the Commission.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is card counting illegal?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Counting with your own memory is not a crime anywhere in the United States. What differs is whether a casino may refuse to deal to you for it: in New Jersey it may not, but it may shuffle at will and adjust limits; in Nevada and most other states it may simply ask you to leave. Devices that count for you are a separate and criminal matter in many places.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you count cards in online blackjack?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not on an infinite-shoe game. Each card is floor(u × 52) where u comes from HMAC-SHA256 of the committed server seed over clientSeed-nonce-cursor, so every card is an independent draw with replacement. Nothing depletes, so there is nothing to count and no countermeasure to apply. Live-dealer games with a physical shoe are the exception, which is why they shuffle early.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://law.justia.com/cases/new-jersey/supreme-court/1982/89-n-j-163-0.html" rel="noopener noreferrer"&gt;Uston v. Resorts International Hotel, Inc., 89 N.J. 163, 445 A.2d 370 (N.J. 1982), argued 9 February 1982, decided 5 May 1982&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://law.marquette.edu/assets/current-students/pdf/Uston-case-reading-assignment.pdf" rel="noopener noreferrer"&gt;Uston v. Resorts International Hotel, Inc. — edited text of the opinion (Marquette University Law School reading assignment)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.upi.com/Archives/1982/05/05/Atlantic-City-casinos-do-not-have-the-right-to/9849100192630/" rel="noopener noreferrer"&gt;UPI, 5 May 1982 — “Atlantic City casinos do not have the right to…”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.upi.com/Archives/1981/05/11/Court-rules-casinos-cannot-ban-card-counters/1380358401600/" rel="noopener noreferrer"&gt;UPI, 11 May 1981 — “Court rules casinos cannot ban card counters”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Uston v. Resorts International Hotel, Inc., 179 N.J. Super. 223 (App. Div. 1981), argued 9 March 1981, decided 11 May 1981&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.courtlistener.com/opinion/350201/kenneth-s-uston-v-airport-casino-inc-a-corporation-dba-marina-casino/" rel="noopener noreferrer"&gt;Uston v. Airport Casino, Inc., 564 F.2d 1216 (9th Cir. 1977), decided 24 May 1977&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://law.justia.com/cases/federal/district-courts/FSupp/448/116/2351558/" rel="noopener noreferrer"&gt;Uston v. Hilton Hotels Corp., 448 F. Supp. 116 (D. Nev. 1978)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caselaw.findlaw.com/court/nj-supreme-court/1416955.html" rel="noopener noreferrer"&gt;Campione v. Adamar of New Jersey, Inc., 155 N.J. 245, 714 A.2d 299 (N.J. 1998), decided 22 July 1998&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://law.resource.org/pub/us/case/reporter/F3/232/232.F3d.173.98-5291.html" rel="noopener noreferrer"&gt;Doug Grant, Inc. v. Greate Bay Casino Corp., 232 F.3d 173 (3d Cir. 2000), decided 2 November 2000&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Ken_Uston" rel="noopener noreferrer"&gt;Wikipedia — Ken Uston&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Resorts_Casino_Hotel" rel="noopener noreferrer"&gt;Wikipedia — Resorts Casino Hotel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Caesars_Atlantic_City" rel="noopener noreferrer"&gt;Wikipedia — Caesars Atlantic City&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Betkyo engine source: blackjack/derive.ts (infinite shoe, deriveBjCard, deal order), _shared/rng.ts (hmacSha256Utf8, u64)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>history</category>
      <category>law</category>
      <category>math</category>
      <category>gamedev</category>
    </item>
  </channel>
</rss>
