{"id":12570,"date":"2025-07-22T08:33:28","date_gmt":"2025-07-22T08:33:28","guid":{"rendered":"https:\/\/thunderpick.gl\/blog\/?p=12570"},"modified":"2025-07-24T11:06:01","modified_gmt":"2025-07-24T11:06:01","slug":"thunderdice-and-thunderlimbo-are-provably-fair","status":"publish","type":"post","link":"https:\/\/thunderpick.gl\/blog\/thunderdice-and-thunderlimbo-are-provably-fair","title":{"rendered":"Thunder Limbo is LIVE and Provably Fair &#8211; Test it yourself"},"content":{"rendered":"<div id=\"bsf_rt_marker\"><\/div>\n<p>It&#8217;s no secret that Thunder Dice, and Thunder Limbo, along with other chance games, are casino games. We also know that randomness plays a huge role in all casino games. But\u2026 How can you, as a Player, be sure that any given casino game is actually random? Is there anything which proves that a game\u2019s randomness is rigged to increase casino margin? Usually, there is no way to check it and Players should believe in game providers\u2019 guarantees. Sometimes third parties\u2019 certificates can increase given game credibility. But is there anything a player can do to check by themselves? Yes and it&#8217;s called the <strong><em>Provably Fair<\/em><\/strong> algorithm.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Provably Fair Gaming<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"450\" height=\"340\" src=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Gaming.jpg\" alt=\"Provably Fair Gaming\" class=\"wp-image-12576\" srcset=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Gaming.jpg 450w, https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Gaming-300x227.jpg 300w\" sizes=\"(max-width: 450px) 100vw, 450px\" \/><figcaption class=\"wp-element-caption\">ft. Provably Fair<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>So how do Provably Fair algorithms work?<\/strong><\/h3>\n\n\n\n<p>The result of each played game is defined by a random number, generated using the <em>Provably Fair <\/em>algorithm. Two main ingredients are used to generate this number are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Game Seed:<\/strong> a <em>String <\/em>value, which is generated by the server before the game, coded (hashed) using the HMAC algorithm and then shared with the Player.<\/li>\n\n\n\n<li><strong>Player Seed: <\/strong>a <em>String <\/em>value, which is generated for the Player and can be changed by the Player <em>before <\/em>the game starts.<\/li>\n<\/ul>\n\n\n\n<p>Details of the algorithm, which transforms Seeds to a random number define the game results. This number is hared with Users (described below).<\/p>\n\n\n\n<p>Once the game is finished, the Player can request for a Seed rotation which also reveals the not-hashed Game Seed.<br>Using this data, the Player can check:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If Server Seed shared by system is the same one which has been known in advance in hashed format;<\/li>\n\n\n\n<li>If the random number generated by the Seed was actually used to define the game&#8217;s outcome.<\/li>\n<\/ul>\n\n\n\n<p><strong>Thunder Dice <\/strong>uses a <em>Provably Fair<\/em> algorithm to make the game fully transparent and give Players the chance to validate it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Seeds and other components<\/h2>\n\n\n\n<p>All parameters which are used by the algorithm to generate the random byte stream are initially generated by the system when the Player opens the game. These parameters are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Player\u2019s Seed<\/strong>:<br>a <em>String <\/em>value which is known and can be changed by the Player.<br>Exception is the first wager, which will be placed using auto-generated seed due to technical limitations.<\/li>\n\n\n\n<li><strong>Server\u2019s Seed<\/strong>:<br>a <em>String <\/em>value generated by the Server and then shared with the User as a Hash code.<br>To generate a Hash from this Seed we use SHA-256 algorithm (input in HEX format)<\/li>\n\n\n\n<li><strong>Nonce<\/strong>:<br>This is counter generated by the system and automatically increased by 1 for each next coin (wager) played. The first played Wager for a given Seed\u2019s pair equals 1.<br>It is needed to differentiate results given by Wagers, as a pair of Seeds is rotated on Player\u2019s demand.<\/li>\n\n\n\n<li><strong>Round:<\/strong><br>A <em>Parameter<\/em>, which is used for each Wager, having 3 values: 0, 1, 2.<br>It is needed, as for each Wager we need to generate 3 different <em>Strings <\/em>(each generated using same pair of Seeds, same <em>Nonce <\/em>and different <em>Round <\/em>value)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How to test that Thunder Dice or Thunder Limbo are Provably Fair<\/h2>\n\n\n\n<p>All these parameters can be checked for each Wager in the <em>Provably Fair <\/em>expandable menu, which can be accessed in the following way:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open \u201cMy Bets\u201d -&gt; \u201cGames\u201d -&gt; <strong>Thunder Dice <\/strong>Wager or <strong>Thunder Limbo <\/strong>Wager -&gt; Share Wager:<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"508\" src=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-1-1024x508.jpg\" alt=\"Provably Fair Bet History in the Games Tab\" class=\"wp-image-12575\" srcset=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-1-1024x508.jpg 1024w, https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-1-300x149.jpg 300w, https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-1-768x381.jpg 768w, https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-1-1536x762.jpg 1536w, https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-1.jpg 1600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">ft. Thunderpick<\/figcaption><\/figure>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Expand Provably Fair menu:<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"420\" height=\"610\" src=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Widget.jpg\" alt=\"Provably Fair Widget\" class=\"wp-image-12574\" srcset=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Widget.jpg 420w, https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Widget-207x300.jpg 207w\" sizes=\"(max-width: 420px) 100vw, 420px\" \/><figcaption class=\"wp-element-caption\">ft. Thunderpick<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"438\" height=\"440\" src=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/ThunderLimbo-Provably-Fair.jpg\" alt=\"Provably Fair Widget for ThunderLimbo\" class=\"wp-image-12590\" srcset=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/ThunderLimbo-Provably-Fair.jpg 438w, https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/ThunderLimbo-Provably-Fair-300x300.jpg 300w, https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/ThunderLimbo-Provably-Fair-150x150.jpg 150w\" sizes=\"(max-width: 438px) 100vw, 438px\" \/><\/figure>\n<\/div>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>In the menu User is able to find Hash prepared from <em>Server Seed<\/em>, <em>Client Seed<\/em>, and <em>Nonce<\/em>.<br>To rotate <em>seeds <\/em>you can use the \u201cRotate your seed pair\u201d feature:<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\"><div class=\"wp-block-group__inner-container\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"616\" height=\"786\" src=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Rotate-Seed-Pair.jpg\" alt=\"Provably Fair Widget Rotating your Seed\" class=\"wp-image-12573\" srcset=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Rotate-Seed-Pair.jpg 616w, https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Rotate-Seed-Pair-235x300.jpg 235w\" sizes=\"(max-width: 616px) 100vw, 616px\" \/><figcaption class=\"wp-element-caption\">ft. Thunderpick<\/figcaption><\/figure>\n<\/div><\/div>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Here, not only the currently used pair of <em>seeds <\/em>are displayed, but also the User is already informed about the next <em>Server Seed<\/em> (of course in Hashed form) and can Edit client seed.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"639\" height=\"1024\" src=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Rotate-Seed-Pair-Change-Button-639x1024.jpg\" alt=\"Provably Fair Widget Change your Seed\" class=\"wp-image-12572\" srcset=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Rotate-Seed-Pair-Change-Button-639x1024.jpg 639w, https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Rotate-Seed-Pair-Change-Button-187x300.jpg 187w, https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-Rotate-Seed-Pair-Change-Button.jpg 654w\" sizes=\"(max-width: 639px) 100vw, 639px\" \/><figcaption class=\"wp-element-caption\">ft. Thunderpick<\/figcaption><\/figure>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>After given pair of Seeds is rotated, the not-hashed Server Seed from previous pair is revealed to Player:<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"626\" height=\"796\" src=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-New-Seed.jpg\" alt=\"Provably Fair Widget Change your to a new seed\" class=\"wp-image-12571\" srcset=\"https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-New-Seed.jpg 626w, https:\/\/thunderpick.gl\/blog\/wp-content\/uploads\/2025\/07\/Provably-Fair-New-Seed-236x300.jpg 236w\" sizes=\"(max-width: 626px) 100vw, 626px\" \/><figcaption class=\"wp-element-caption\">ft. Thunderpick<\/figcaption><\/figure>\n\n\n\n<p>In the result, players have access to all parameters, which allows them to check if a given Wager was actually randomly generated. In the next paragraph there is an explanation on how a random number is generated from these parameters.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Generation of Random Number<\/strong> <\/h2>\n\n\n\n<p>The game draws a random number between 0 and 1 (but never exactly 0; it\u2019s always a tiny bit more than 0). To generate a random number, Thunder Limbo uses <em>HMACSHA256 <\/em>algorithm, which generates a byte stream with length of 32 bytes. To be more precise, following algorithm is used: <\/p>\n\n\n\n<p><strong>Byte <\/strong>Stream(length equal to 32) = hmacsha256key, message where: <br><strong>Key <\/strong>= server_seed Message = client_seed:nonce:round<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">RNG Code: Thunder Limbo &amp; Thunder Dice<\/h2>\n\n\n\n<p><strong>double <\/strong><em>FirstByteDenominator <\/em>= 256.0;<br><strong>double <\/strong><em>SecondByteDenominator <\/em>= 256.0 * 256.0;<br><strong>double <\/strong><em>ThirdByteDenominator <\/em>= 256.0 * 256.0 * 256.0;<br><strong>double <\/strong><em>FourthByteDenominator <\/em>= 256.0 * 256.0 * 256.0 * 256.0;<br><br><strong>void<\/strong> <em>Fill<\/em>(byte[] serverSeed, <strong>string<\/strong>? clientSeed, <strong>long <\/strong>nonce, <strong>double<\/strong>[] result)<br>{<br>&nbsp; &nbsp; <strong>var <\/strong><em>hmac <\/em>= <strong>new<\/strong> HMACSHA256(Encoding.ASCII.GetBytes(Convert.ToHexString(serverSeed)));<br>&nbsp; &nbsp; <strong>var <\/strong><em>messageTemplate <\/em>= $&#8221;{clientSeed}:{nonce}:&#8221;;<br>&nbsp; &nbsp; <strong>var <\/strong><em>rngData <\/em>= <strong>new<\/strong> byte[32];<br><br>&nbsp; &nbsp; <strong>var <\/strong><em>neededRounds <\/em>= (int)Math.Ceiling(result.Length \/ 8M);<br><br>&nbsp; &nbsp; <strong>var <\/strong><em>idx <\/em>= 0;<br>&nbsp; &nbsp; <strong>for<\/strong> (<strong>var <\/strong><em>round <\/em>= 0; round &lt; neededRounds; ++round)<br>&nbsp; &nbsp; {<br>&nbsp; &nbsp; &nbsp; &nbsp; <strong>var <\/strong><em>message <\/em>= messageTemplate + round;<br>&nbsp; &nbsp; &nbsp; &nbsp; <strong>var <\/strong><em>encodedMessage <\/em>= Encoding.ASCII.GetBytes(message);<br>&nbsp; &nbsp; &nbsp; &nbsp; <strong>var <\/strong><em>bytesWritten <\/em>= hmac.ComputeHash(encodedMessage, rngData)<br><br>&nbsp; &nbsp; &nbsp; &nbsp; <strong>for<\/strong> (<strong>var <\/strong><em>offset <\/em>= 0; <em>offset <\/em>&lt; 32; <em>offset <\/em>+= 4)<br>&nbsp; &nbsp; &nbsp; &nbsp; {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var <em>value <\/em>= rngData[offset] \/ FirstByteDenominator +<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rngData[offset + 1] \/ SecondByteDenominator +<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rngData[offset + 2] \/ ThirdByteDenominator +<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rngData[offset + 3] \/ FourthByteDenominator;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result[idx] = value;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ++idx;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>if<\/strong> (idx == result.Length)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>break<\/strong>;<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; }<br>}<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dice Round Result Calculation<\/h3>\n\n\n\n<p>In our version of dice, we cover a possible roll spread of 00.00 to 100.00, which has a range of 10,001 possible outcomes.<br>The game event translation is done by multiplying the generated number by the number of possible outcomes and then dividing by 100 so that the Round result fits the constraints of our stated dice range.<br>Round Result = Random number * number of outcomes \/ 100<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example Calculation<\/h3>\n\n\n\n<p>Suppose the random number drawn is 0.25:<br>Round Result = 0.2555 * 10001 \/ 100<br>So, the round result is 25.00.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Limbo Round Multiplier Calculation<\/h3>\n\n\n\n<p>The game uses the following formula to determine the round multiplier:<br>Multiplier = RTP \/ Random Number<br>RTP stands for &#8220;Return to Player&#8221; and for Thunderpick games, it is 0.98 (or 98%).<br>Random Number is the value drawn in the previous step (a random number between 0 and 1, but never exactly 0).<br>If the result is less than 1, it\u2019s set to 1 (so the minimum possible multiplier is 1).<br>Round Multiplier = max(multiplier, 1);<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example Calculation<\/h3>\n\n\n\n<p>Suppose the random number drawn is 0.25:<br>Round Multiplier = 0.98 \/ 0.25 = 3.92<br>So, the round multiplier is 3.92x. If your target multiplier is more than or equal to the round multiplier, you win.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Check it yourself!<\/h2>\n\n\n\n<p>Now that you have all the information to check our&nbsp; Thunder Dice is <strong>Provably Fair<\/strong>. Try it for yourself after your next game!&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>It&#8217;s no secret that Thunder Dice, and Thunder Limbo, along with other chance games, are casino games. We also know that randomness plays a huge role in all casino games. But\u2026 How can you, as a Player, be sure that any given casino game is actually random? Is there anything which proves that a game\u2019s [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":12651,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[92,67,53,75,54,1],"tags":[],"class_list":["post-12570","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-casino","category-crypto","category-news","category-promotions","category-platform","category-uncategorized"],"acf":[],"_links":{"self":[{"href":"https:\/\/thunderpick.gl\/blog\/wp-json\/wp\/v2\/posts\/12570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thunderpick.gl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thunderpick.gl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thunderpick.gl\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thunderpick.gl\/blog\/wp-json\/wp\/v2\/comments?post=12570"}],"version-history":[{"count":12,"href":"https:\/\/thunderpick.gl\/blog\/wp-json\/wp\/v2\/posts\/12570\/revisions"}],"predecessor-version":[{"id":12727,"href":"https:\/\/thunderpick.gl\/blog\/wp-json\/wp\/v2\/posts\/12570\/revisions\/12727"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thunderpick.gl\/blog\/wp-json\/wp\/v2\/media\/12651"}],"wp:attachment":[{"href":"https:\/\/thunderpick.gl\/blog\/wp-json\/wp\/v2\/media?parent=12570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thunderpick.gl\/blog\/wp-json\/wp\/v2\/categories?post=12570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thunderpick.gl\/blog\/wp-json\/wp\/v2\/tags?post=12570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}