翻译:王成林(麦克斯韦的麦斯威尔)审校:黄秀美(厚德载物)
大家好,你们能听到我讲话吗?这个演讲的内容是介绍RNG(随机数字生成)的一些黑暗秘密。如你在大屏幕上看到的,Squirrel已经介绍了一些RNG的基础概念。

首先,我想详细讲解几点。他的演讲更偏重理论,而我的更偏重实际应用一些,不仅仅会讨论一些在游戏开发中遇到的RNG相关的潜在的问题,还会介绍解决这些问题的工具。这个题目“黑暗秘密”不太好,会让人以为Squirrel探讨了黑暗的、复杂的数学公式,不过我们的重点是谈论如何使用那些数学公式。
首先我是谁?为什么你们要听我的演讲呢?这些是我参与制作的游戏。

有很多!在一些大工作室,我参与了《炉石传说》的制作,设计了游戏的一些原型,这是我制作的最好的一款游戏了。我只在那里工作了一年,当然是制作CCG(交换卡牌游戏),其中有很多随机数字生成。我独立开发过很多游戏,比如右下角的《Overland》,是一款roguelike类型游戏,其中有很多随机生成的关卡。现在我在Direwolf工作,位于科罗拉多州的丹佛市,我仍然负责开发CCG。也许以后会在这干下去,也许不会。
不过我们来谈谈使用RNG吧。我们从一些基础的、作为一名程序员在这个领域必须要面对的问题决策开始。这款解谜游戏《Connectrode》是我之前在2011年制作的,我的妻子非常喜欢,试玩了这款游戏的未成品。
这款俄罗斯方块风格的游戏会随机生成一些方块。有一天晚上我的妻子向我抱怨道:在一行中出现了9个颜色相同的方块!我意识到我需要修复这个bug。我采用俄罗斯方块游戏所使用的方法,有时人们将这个方法称为套袋方法(Bagging)。

这是用来为你的游戏加入随机性的一个基础方法。如果你像我一样每一轮都投掷一次骰子来从6个数字中随机得到一个数字,你会得到一个均匀分布。不过有的时候你不希望这个随机性过于随机,一个简单的方法是——这其实是一个设计决定,或者桌游设计者会这样说——“这里不应该使用骰子,而应该使用一副纸牌。”从数学上来讲,投骰子是对一个随机集合进行取样,允许样本的重复,取样不会改变该集合;而使用纸牌的话,你从中抽出一张牌后这张牌不会回到牌组中。

这样可以确保在分布中不会产生重复的结果。多数使用套袋方法的游戏都有一个套袋,套袋中包含一个随机集合。考虑纸牌的洗牌。我们可以使用三副纸牌洗牌——实际上拉斯维加斯的赌场现在就是这样做的,为了防止人们在黑杰克21点游戏中作弊。他们把三副或者更多副纸牌混在一起洗牌,这样会改变纸牌分布的随机性。因此如果你发现相同的分布规律一次又一次地出现,那么你要重点考虑一下它,这种情况对我来讲并不常见,不过你应该使分布更加平稳。另外我们还要考虑边缘情况。如果你同时洗三副牌,然后当没有牌的时候重新洗牌,首先你会想到你能得到的最大组合是三个黑桃尖。接着如果你重新对一副新牌洗牌,这时会产生一种边缘情况——字面意义上的边缘情况,即在一个套袋的末尾你有可能得到三个黑桃尖,而在另一个套袋的开始你又得到了三个黑桃尖。

这个边缘情况作为随机性的一个特殊情况值得考虑,因为这是RNG的第一个黑暗秘密:如果你没有提前计划使其不可能发生,那么每个随机的边缘情况可以发生,(最终!)将会发生在一个玩家上。