一次掷骰,9,999种结果
骰子是网站上最简单的游戏:选择目标,选择小于或大于,掷骰要么落在你选择的一侧,要么不落。屏幕显示每个目标的胜率和倍数,两者看起来相乘正好等于99%——本金返还减去1%的庄家优势。引擎比屏幕显示的更精确,有两种方式都对玩家不利,本文精确计算了它们。
ENGINE-VERIFIEDOriginalBaseDiceService.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.
庄家服务携带自己的算术测试DiceHouseEdgeTest,检查没有目标返回超过99%,且向下取整永不超过一个舍入步骤。两者都成立。该测试未打印的是每个目标实际返回多少,这就是玩家需要的表。
显示的胜率和真实的胜率
屏幕上显示的胜率是计算为掷骰是0到100之间的连续数字。事实并非如此:它是9,999步中的一个。小于目标T的掷骰在结果0.01到T − 0.01之间赢,即100 × T − 1个,所以真实胜率是(100T − 1) ÷ 9,999。在大多数目标处差异不可见;在最小的目标处则不然。
| 目标(小于) | 9,999中的获胜结果 | 显示胜率 | 真实胜率 |
|---|---|---|---|
| 2.00 | 199 | 2.00% | 1.9902% |
| 5.00 | 499 | 5.00% | 4.9905% |
| 10.00 | 999 | 10.00% | 9.9910% |
| 25.00 | 2,499 | 25.00% | 24.9925% |
| 50.00 | 4,999 | 50.00% | 49.9950% |
| 75.00 | 7,499 | 75.00% | 74.9975% |
| 90.00 | 8,999 | 90.00% | 89.9990% |
| 98.00 | 9,799 | 98.00% | 97.9998% |
True chance = (100 × target − 1) ÷ 9,999。在目标T上方滚动在9,999 − 100T个结果上获胜,所以Over T的定价完全相同于Under (100 − T):Over 50也在4,999个结果上获胜。
差距始终是一个结果。在50%的目标下,成本为0.005个百分点的概率,百分比回报的百分之一;在2%的目标下,滑块允许的最紧,200个中的一个结果约占赢的概率的百分之0.5,回报从99.00%下降到98.51%,原因仅在于此。相同的事实解释了一个小奇异性:恰好50.00的滚动同时输给Under 50和Over 50,因为两种比较都不包括目标。它每9,999次滚动发生一次。
两位小数下限
第二个成本是乘数。引擎将0.99除以赢的概率并保留两位小数,始终向下舍入。当除法结果精确时——0.99 ÷ 0.50 = 1.98,0.99 ÷ 0.25 = 3.96——没有损失。当它不是时,玩家得到截断的数字:0.99 ÷ 0.80 = 1.2375,支付为×1.23。在高赢的概率下,乘数接近1,被丢弃的百分位数是利润的很大一部分,回报下降幅度远大于低端。
| 目标(低于) | 支付 | 显示的概率×支付 | 真实回报 |
|---|---|---|---|
| 2.00 | ×49.50 | 99.00% | 98.51% |
| 5.00 | ×19.80 | 99.00% | 98.81% |
| 7.00 | ×14.14 | 98.98% | 98.85% |
| 10.00 | ×9.90 | 99.00% | 98.91% |
| 13.00 | ×7.61 | 98.93% | 98.86% |
| 25.00 | ×3.96 | 99.00% | 98.97% |
| 40.00 | ×2.47 | 98.80% | 98.79% |
| 50.00 | ×1.98 | 99.00% | 98.99% |
| 70.00 | ×1.41 | 98.70% | 98.70% |
| 80.00 | ×1.23 | 98.40% | 98.40% |
| 90.00 | ×1.10 | 99.00% | 99.00% |
| 95.00 | ×1.04 | 98.80% | 98.80% |
| 97.06 | ×1.01 | 98.03% | 98.03% |
| 98.00 | ×1.01 | 98.98% | 98.98% |
真实回报 = 倍数 × (100 × 目标 − 1) ÷ 9,999。在 90.00 时为 98.999%,滑块上最高的;在 97.06 时为 98.030%,最低的。Over 目标镜像这些行:Over T 返回 Under (100 − T) 返回的内容。
一起读右边的两列,两个成本分别清楚地分离。在低目标处,倍数通常能整除,整个不足是缺失的结果;在高目标处,缺失的结果可忽略不计,不足几乎全是底数。目标 80 是最清楚的情况:0.99 ÷ 0.8 需要 ×1.2375,表格支付 ×1.23,回报是 98.40% — 庄家优势是 1.6%,不是 1%。97.06 到 98.00 之间的每个目标都支付相同的 ×1.01,所以你转向 97.06 放弃的机会没有买到任何东西。
在整个滑块上 — 从 2.00 到 98.00 的每个目标,步长为 0.01,共 9,601 个设置 — 真实回报平均为 98.72%。其中只有 585 个设置,6.1%,回报为 98.95% 或更多;1,453 个,15.1%,回报少于 98.50%。
输入倍数,而不是百分比
游戏有第二种设置投注的方式:输入你想要的倍数,它会计算出目标。它选择底数支付至少是你输入的倍数的目标,所以输入的倍数总是落在 0.99 ÷ 概率能整除的设置上。这完全消除了底数成本;只有单一结果差距保留。
| 已输入 | 目标 (UNDER) | 真实概率 | 真实回报 |
|---|---|---|---|
| ×1.10 | 90.00 | 89.9990% | 99.00% |
| ×1.20 | 82.50 | 82.4982% | 99.00% |
| ×1.50 | 66.00 | 65.9966% | 98.99% |
| ×2 | 49.50 | 49.4949% | 98.99% |
| ×3 | 33.00 | 32.9933% | 98.98% |
| ×5 | 19.80 | 19.7920% | 98.96% |
| ×10 | 9.90 | 9.8910% | 98.91% |
| ×20 | 4.95 | 4.9405% | 98.81% |
| ×49.50 | 2.00 | 1.9902% | 98.51% |
dice/diceApi.ts中的targetForMultiplier()函数会对Under目标值向下取整(或对Over目标值向上取整),这样赔率永远不会超过输入的倍数所暗示的赔率。返回值四舍五入到小数点后两位;×1.10是98.999%,×1.20是98.998%。
实用规则很简单。如果你关心最后的半个百分点,与其设置百分比不如设置倍数,而且最好在低赔率范围内选择整数倍数。一个因为看起来是整数百分比而选择的目标值——80、70、40——的赔率往往不如相邻的目标值好。这都不改变长期趋势:每个设置都会返回少于本金的结果,马丁格尔、定价和破产风险说明了为什么没有任何投注序列能改变这一点。
Limbo从构造上就避免了向下取整:玩家直接设置赔率,抽取的数字会与同一个数字比较,所以没有需要付出代价的第二次舍入。Dice报价一个赔率概率,然后从中推导赔率,正是这个推导过程中出现了向下取整。
自己验证一轮游戏
- 在你开始游戏前,公平性面板会显示服务器种子的SHA-256指纹。之后轮换你的种子对以揭示种子并确认指纹。
- 用服务器种子作为密钥,用"clientSeed-nonce-0"作为消息计算HMAC-SHA256;一轮游戏只使用游标0。
- 读取摘要的前13个十六进制数字作为整数,除以2⁵²得到u。结果为(floor(u × 9,999) + 1) ÷ 100。将其与您的目标严格比较,并将您的彩票上的倍数与0.99 ÷ chance四舍五入到小数点后两位进行比较。
如果结果匹配,这在您选择目标之前就已确定——正如哈希承诺证明的内容所解释的,这正是承诺保证且仅保证的内容。目标的价格不在哈希中。它在上面的两行算术中,这就是本文存在的原因。
常见问题
掷骰子游戏的真实赔率是多少,掷骰子范围是0到100?
这里的掷骰子是9,999个结果中的一个,从0.01到99.99。掷骰子低于T时在其中100 × T − 1个结果上获胜,所以掷骰子低于50的概率是49.995%,掷骰子低于10的概率是9.991%,掷骰子低于2的概率是1.990%。
掷骰子游戏的庄家优势是多少?
公布的优势是1%,但真实返还取决于目标:目标为90时为99.00%,目标为97.06时为98.03%。在从2.00到98.00的每个滑块设置上平均而言为98.72%,有效优势为1.28%。
为什么我的掷骰子倍数看起来向下四舍五入了?
游戏引擎支付0.99 ÷赔率概率,四舍五入到小数点后两位。在80%的目标下,这是1.2375,支付为×1.23,返还98.40%而不是99%。
在掷骰子游戏中选择什么目标最好?
任何0.99 ÷概率能完全整除的目标,如50(×1.98)、25(×3.96)、90(×1.10)或66(×1.50)。输入倍数而不是百分比可以自动找到一个。没有目标返还超过99%。
如果掷骰子的结果正好落在我的目标上会怎样?
它会输。Under仅在目标下方获胜,Over仅在目标上方获胜,所以掷骰子结果正好是50.00时,Under 50和Over 50都会输。这在9,999次掷骰子中发生一次。
我可以验证掷骰子的结果吗?
可以。HMAC-SHA256 "clientSeed-nonce-0"由公开的服务器种子作为密钥;前13个十六进制数字除以2⁵²得到u,(floor(u × 9,999) + 1) ÷ 100就是结果。
资料来源和参考
- Betkyo引擎源代码,服务提供商:OriginalBaseDiceService.kt — getResult()(nextIntBelow(9999) + 1,除以100)、getWinChance()(4位小数向下取整)、checkAndGetMultiplier()((1 − 庄家优势) ÷赔率概率,2位小数向下取整)、getEarned()(严格比较);SeedPairRandom和PfHashUtils.normalize()(前13个十六进制数字÷ 2⁵²);DiceHouseEdgeTest.kt
- Betkyo引擎源代码,客户端镜像:dice/diceApi.ts中的payoutMultiplier()和targetForMultiplier();diceGame.tsx中的2.00–98.00滑块范围
- 为本文编写的精确计算:(100T − 1) ÷ 9,999赔率概率和所有9,601个滑块目标的向下取整倍数、它们的真实返还和分布;通过将400,000次HMAC流的掷骰子重播进行结果推导交叉检查(掷骰子低于50:模拟值49.88%对比精确值49.995%;结果范围从0.01到99.99)
本文中的游戏