Back to blog
游戏机制

Mini Kraken 的骰子公平吗?深入骰子引擎一探究竟

每一桌游戏迟早都会问出这句话:这东西是不是被做了手脚?这里我们用一次坦诚、没有术语的讲解,带你看看 Mini Kraken 是如何选出一个数字的——它为什么公平,你如何亲自验证,以及我们在幕后从不会做的事。

Mini Kraken 的骰子公平吗?深入骰子引擎一探究竟

迟早会有人在牌桌边把话说出口:“这绝不可能是随机的。这东西就是跟我过不去。”数字骰子没法在真实的木桌上咔啦啦地滚动,所以每当霉运接二连三地砸下来,你自然会怀疑这个应用是不是在暗中做了手脚。

问得好。这个问题值得一个直截了当的回答,那就先把结论摆在前面:Mini Kraken 的骰子是公平的。每一面的概率都相等,没有任何暗中的偏袒,而且——这一点并不常见——你其实可以亲自验证一次掷骰。本文会用大白话把其中的原理讲清楚,这样下次再有人提起这个话题时,你就有实实在在的依据可以指出来。

“公平”究竟意味着什么

在聊我们的引擎之前,先弄清楚一颗公平的骰子到底是什么,会很有帮助。

一颗公平的 d20 只意味着一件事:它的二十个面出现的概率完全相等——每掷一次,都是干干净净的二十分之一。不是“大致相等”,也不是“平均下来相等,只是庄家占了点便宜”。是恰好相等。一颗公平的 d6 让每一面都有六分之一的机会;一颗公平的 d100,则是百分之一。这就是它的全部定义。

请注意公平没有承诺的东西。它没有承诺你掷二十次就能见到全部二十个数字。它没有承诺一段霉运很快就会“扯平”。它没有承诺结果感觉上是均匀的。公平永远只是关于每一次掷骰概率的一句话——而在这一点上,我们绝不妥协。

引擎盖之下

Mini Kraken 掷骰子时,用的不是自己拼凑出来的土办法。每一次掷骰——无论是在网站上、在你的角色卡里、在虚拟桌面上,还是通过 Fortuna 这个 Discord 机器人——走的都是同一套共享的骰子引擎,它建立在一个成熟的、开源的骰子库之上,多年来一直在为桌游玩家掷骰。

这一点很重要,原因有二。第一,开源的根基意味着背后的数学不是一个神秘的黑箱;那是任何人都能阅读、测试、拆解剖析的代码。第二,这意味着我们没有去重新发明一样精密脆弱的东西。随机性正是那种自作聪明的自制方案容易引入微妙偏差的领域,而久经考验的库之所以存在,恰恰就是为了让谁都不必自己动手去造。

真正关键的,是当引擎需要一个数字时,它究竟做了什么。

一个数字是如何选出来的——以及为什么其中没有隐藏的偏差

接下来是大多数人从没听说过的部分,而它才是“这公平吗”这个问题真正的核心。

模拟一次掷骰最粗糙的做法,是抓取一个随机数,再用取余除法把它削减到合适的大小——也就是编程里“相除取余数”的操作。这办法很快,而且几乎算得上公平。但它有一个著名的缺陷,叫作取模偏差(modulo bias):因为你起始的取值范围很少能被骰子面数整除,最后总会有几个面的概率比其他面稍稍高那么一点。放在单独一颗 d20 上,这点偏斜微乎其微,但它真实存在,而且正是那种看不见的、在天平上悄悄压手指的把戏,会让“做了手脚”的指控显得站得住脚。

我们的引擎拒绝走这条捷径。它不会硬把一个别扭的数字塞进去凑合,而是采用一种常被称为拒绝采样的技术。说白了就是:如果一个原始随机值落进了那一小片让概率失衡的多余区间,引擎就把它丢掉,悄悄地重新抽一次。它只保留那些能完美均匀地对应到骰子各个面上的数值。这样得到的分布完全没有偏差——每一面都落在它精确而诚实的概率上。你永远不会注意到偶尔的那次重抽;它发生在千分之几毫秒的瞬间。但正因为有它,一颗 Mini Kraken 的 d20 才能达到数学所允许的极致均匀。

这就是整个答案的技术骨架。在这里,“公平”不是一个营销辞令;它是数字被选出的方式所具备的一种属性。

3D 骰子是一场诚实的表演

Mini Kraken 以它那真实的 3D 物理骰子闻名——它们在屏幕上翻滚、最终停定,而这恰恰是一个讲道理的人可能起疑心的地方。如果由一套物理模拟来决定骰子停在哪里,那这段动画岂不是可以被调校成专挑小数字落地?

不会——原因在于事件发生的先后顺序。引擎先选定数字。然后动画才被告知要停在这个数字上。你看到的那颗翻滚的骰子,是对一个结果的忠实演绎,而这个结果早在前一瞬间,就已经由上文所说的那套无偏引擎公平地决定好了。物理效果的存在是为了手感——那种令人满足的咔啦声和翻滚感,是干巴巴的文字结果所抹平不了的——而不是为了决定结果。它是叠加在诚实数学之上的表演功夫,而且它压根不可能拨动那个数字,因为早在骰子开始转动之前,数字就已经存在了。

一套引擎,无处不在——于是一次掷骰的含义处处如一

信任有一个不易察觉的来源,那就是一致性。在某些平台上,此处的一次掷骰和彼处的一次掷骰表现并不相同。而在 Mini Kraken 上,d20 就是 d20——不管你是在角色卡上点它、把它丢到虚拟桌面上,还是在有 Fortuna 监听的 Discord 频道里把它敲出来。

这是因为所有这些界面调用的都是同一套引擎。并不存在一个给网站用的“和善”掷骰器,再另配一个给 Discord 用的。一次掷骰在整个生态系统里承载着完全相同的含义,这既是一种便利,也是一种保证:不存在某个概率被悄悄改动的特殊模式。

你其实可以亲自验证一次掷骰

下面这个特性,能把“相信我们”变成“你自己查”。

这套引擎支持确定性重放。说白了,一次掷骰可以和一个叫作种子(seed)的小小起始值绑定,而同一个种子永远会重现出一模一样的结果序列。把同一个种子喂给引擎两次,你每一次都会得到完全相同的骰子。这与做手脚的系统恰恰相反:一个动了手脚的掷骰器必须藏着它的运作方式,而我们的引擎却能把配方直接交到你手上,并证明相同的输入永远产生相同的、可复现的输出。能重放的随机,就是能审计的随机。

我们从不做的事

公平不仅关乎技术,也同样关乎克制。所以,直白地说,以下就是 Mini Kraken 的骰子绝不会做的事:

  • 没有“骰子因果报应”。我们绝不会记着你一直走背运,然后偷偷塞给你一次好骰来补偿你——反过来也不会。每一次掷骰都是独立的,和真实骰子一模一样。
  • 没有暗中的篡改。不存在什么看不见的“平滑处理”,去削掉你的极端结果、好让数字显得顺眼一些。有些工具会悄悄这么干。我们不会;连成一串就是连成一串。
  • 没有暗藏的调整值。唯一会被计入的加值,就是你在掷骰结果里能看到的那些——你角色卡上的调整值、优势之类。没有任何东西是在暗处被加上或减去的。
  • 没有针对性。引擎不知道、也不在乎你是谁。它不会对游戏主持人更好,也不会对新玩家更狠。它根本就不知道“玩家”是个什么东西。

骰子是冷漠无情的。而这种冷漠,正是关键所在。

“可我的骰子还是很邪门”

它们也许确实会给你这种感觉——而且即便骰子完美无缺,这种感觉也是真实的。真正的随机是疙疙瘩瘩的:它会制造出连成一串的结果、扎作一堆的结果,以及残忍的巧合时机,远比我们的直觉所预期的要频繁得多;而我们的记忆则死死抓住那些灾难,悄悄丢弃那些不值一提的平庸掷骰。一颗公平的 d20 绝对会时不时地一连甩给你三个 1;那不是偏差的证据,而是随机性正在尽职尽责的证据。

“公平”与“感觉公平”之间的这道鸿沟,大到值得单独写一篇文章——想了解霉运连串背后的心理学,请看《为什么公平的骰子感觉像被操纵》。而如果你想用实证的方式满足心里那个怀疑派,最诚实的检验方法就是靠数量:把一颗 d20 掷上几百次,看着结果的分布渐渐摊平、趋于均匀。十来次掷骰永远看起来疙疙瘩瘩;掷上一千次,才会道出真相。

放心地掷骰吧

那么,Mini Kraken 公平吗?公平——这是设计使然,而非口头承诺。每一面的概率都相等,每个数字背后的数学连小数点后都毫无偏差,3D 动画只是把一个早已诚实选定的结果演出来,同一套引擎在所有地方运行,而一次掷骰可以被复现、被核查,而不必只凭信任去接受。

骰子不爱你,也不恨你。它们只是滚动而已。而在 Mini Kraken 上,它们滚得堂堂正正——这样你就可以不必再琢磨那些机械原理,回到故事里去,那才是真正精彩的东西发生的地方。