公平硬币的代价
以等赔率支付的公平硬币是一个没有优势的游戏,而没有优势的游戏无法支撑起庄家的运营。每个网站上的每一款猜硬币游戏都用以下两种方式之一来解决这个问题:要么让硬币变得不公平,要么对猜对的一方支付低于×2的赔率。第一种是隐性的,第二种不是,而这正是应该选择后者的全部理由。小判支付×1.96。
算法很简单。猜对的概率是二分之一,每单位下注返还1.96单位;猜错则一无所获。每次翻转的期望回报是0.5×1.96=0.98,也就是说庄家每次翻转保留2%。因为连续下注(riding)的奖池是每次获胜都乘以1.96,而每次获胜的概率相同,所以任意长度的连续下注的期望回报就是0.98的该长度次方,按每单位风险敞口计算,整个过程的优势始终保持在2%。连续下注既不能绕开这个优势,也不会陷入更大的优势;它只是把同样的价格多付了几次。
引擎验证koban/derive.ts: KOBAN_WIN_100 = 196,注释写道“每次猜对×1.96——以1.96赔率支付的公平硬币意味着2%的庄家优势”;KOBAN_MAX_FLIPS = 10。_shared/demoLocal.ts 中的 demoKobanRide:每次获胜后奖池为 centsFloor(奖池 × 196 / 100);猜错则该轮结束,派彩为0;达到十次翻转时奖池自动入账。
阶梯
连续下注十次,奖池就被乘以1.96共十次。表格显示的阶梯就是这个幂次,每一级都向下取整到分,因为服务器是以分为单位结算奖池的,显示的每一级必须与实际支付的金额一致。未取整的1.96的三次方是7.53;而三次获胜后的奖池实际是7.52。引擎注释记录到,在加入取整之前,显示曾经把十级中的六级多算了一分。
| 胜利次数 | 倍数 | 达到该级的概率 |
|---|---|---|
| 1 | ×1.96 | 2分之1 |
| 2 | ×3.84 | 4分之1 |
| 3 | ×7.52 | 8分之1 |
| 4 | ×14.75 | 16分之1 |
| 5 | ×28.92 | 32分之1 |
| 6 | ×56.69 | 64分之1 |
| 7 | ×111.12 | 128分之1 |
| 8 | ×217.79 | 256分之1 |
| 9 | ×426.87 | 512分之1 |
| 10 | ×836.68 | 1,024分之1 |
每一级奖梯是 floor(1.96ⁿ × 100) ÷ 100。用任意一级奖梯乘以其对应概率,得到的都是 0.98ⁿ,也就是恰好骑到那一级的预期回报。
引擎验证koban/derive.ts:显示用的奖梯数组是 Array.from({ length: KOBAN_MAX_FLIPS }, (_, i) => Math.floor(Math.pow(KOBAN_WIN_100 / 100, i + 1) × 100) / 100),注释写明服务器按 floor(1.96ⁿ, 2) 结算,并且“奖梯即承诺,必须与派彩一致”。表中的概率对公平硬币而言是 1/2ⁿ。
要看的是右边那一列。骑到顶端赔付 ×836.68,概率为 1/1,024,因此其预期回报是 0.817,正是 0.98 的十次方。奖梯上没有哪一级比另一级更划算或更不划算;奖梯本质上是波动性的选择,就像Limbo 和 Crash 的曲线一样,多骑一次的代价对公平硬币来说是同样的运作方式。
在第一次购买时固定
这里有一个玩家看不到但应该了解的设计决策。一次骑乘并不是十个独立的回合,而是一个回合、一个 nonce,十个面是同一个 nonce 的十个游标:第一次翻转读取游标 0,第二次读取游标 1,依此类推。整个面序列作为种子对与 nonce 的函数,在第一枚硬币被购买的那一刻就已经存在。骑乘并不会抽取新的硬币,只是揭示一份早已完整的列表中的下一项。
引擎验证koban/derive.ts 头部注释:“一次骑乘会话 = 一对(种子对,nonce);第 i 次翻转读取游标 i,因此连胜中的每一个面,在你购买第一枚硬币的那一刻就已固定——你的选择决定输赢,从不决定面本身。”demoLocal.ts:demoKobanRide 通过 deriveKobanFaces(serverSeed, clientSeed, nonce, picks.length) 推导面,并比较 faces[picks.length − 1] 与你的选择;当前回合会持久化存储在 localStorage 中,因此重新加载不会在连胜途中吞掉奖池。
为什么要这样设计,而不是每次翻转用一个新的 nonce?有两个原因,都与可验证性有关。首先,作为一个整体回合,一次骑乘可以作为单一对象被验证:揭示种子后,包括你套现之后的那些面在内,整个骑乘的所有面都可以一并重新计算出来,这比逐次验证每一次翻转更有力。其次,这从结构上杜绝了某种作弊的可能。如果每次翻转都是临时抽取的,理论上系统可以在奖池变大之后改变抽取方式;但如果所有面在奖池存在之前就已固定,就不可能这样做。引擎在决定面的时候并不知道你的奖池会有多大,因为它在你拥有奖池之前就已经决定了面。
这也解答了姊妹游戏丁半(chō-han)在其自己的文章中提出的问题:你的选择重要吗?对结果来说,不重要。游标 4 上的面是什么就是什么;喊“表”或“里”决定的是那个面是否付钱给你,而不是那个面是什么。这与客户端种子的性质相同,都是只改变可验证性、从不改变赔率的杠杆,在连胜让硬币看起来像是在“听你的”之前,最好保持清醒的认识。
套现
唯一真正重要的决定是何时停止,而引擎只给出一种形式:每次获胜后,你可以选择套现奖池,或者继续骑乘。没有部分套现,也没有保险,因为二者都会让优势变得不那么明显。在第 n 次获胜后套现,恰好按第 n 级奖梯赔付;继续骑乘则是拿整个奖池去冒险,而那枚硬币的面其实早已列在名单上了。
- 优势不会随奖梯变化。每次翻转都会消耗押注金额的 2%。奖池大不是停止或继续的理由;那只是同样价格下的一个更大的数额。
- 十连胜就是顶点。第十次获胜时,奖池会自动结算入账,因为奖梯到此结束,引擎不提供第十一个游标。
- 重新加载不等于重置。当前的骑乘状态会被保存,因此在连胜途中关闭标签页不会丧失奖池;返回时同样的面依然等待着你,因为它们从来不取决于你何时查看。
以上的倍率和规则均来自客户端推导模块和演示引擎,源代码将其描述为镜像官方服务;官方服务才是最终的支付权威。这是一份设计说明,而非策略建议:无论怎样喊或何时停止,都不会改变每次翻转 2% 的优势。
常见问题
Koban Flip 的赔付是多少?
在公平硬币上,每次正确猜中赔付 ×1.96,并在骑乘中复利累积。连续赢 n 次后的奖梯是 floor(1.96ⁿ, 保留2位小数),从 ×1.96 一直到十连胜时的 ×836.68。
庄家优势是多少?
每次翻转 2%:正确猜中的概率是二分之一,但赔付是 1.96 而不是 2。骑乘 n 次翻转的预期回报是 0.98ⁿ,因此无论骑多远,每单位风险敞口的优势始终保持 2%。
骑乘过程中面是即时决定的吗?
不是。一局游戏对应一个种子对和nonce,第i次抛掷由光标i推导得出,所以在买入第一枚硬币时,每一面就已经固定了。你的选择只决定某一面是否给你派彩,而不会决定它显示什么。
我可以验证一局游戏吗?
可以。服务器种子公开后,该局游戏的所有面都可以通过种子对和nonce重新计算出来,包括你提现之后的抛掷。
赢十次会发生什么?
奖池会按投注额的×836.68自动入账。十次是本局的最大长度,不存在第十一个光标。
来源与参考资料
- Betkyo引擎源码:koban/derive.ts (KOBAN_WIN_100, KOBAN_MAX_FLIPS, 向下取整阶梯, deriveKobanFaces), _shared/demoLocal.ts (demoKobanBuy, demoKobanRide, demoKobanCashout)
- 阶梯数值为floor(1.96ⁿ × 100) ÷ 100,其中n = 1…10,为本文计算得出,并与引擎的显示函数相匹配
本文涉及的游戏