《侵袭之塔2》中的相关随机性
2026-06-13 关于单人游戏《侵袭之塔2》的三个真实陈述:如果你在下水道选择了Neow的骨头,随机诅咒大约有54%的几率是负债。* 从垃圾堆事件中不可能获得反弹。你在下水道的第一次战斗有76%的几率掉落药水,而在过生长的地方则只有4%的几率掉落药水。**(*假设Neow的骨头中的遗物都不是新叶或万花筒)(**假设你的Neow遗物没有提供牌或其他遗物)(***均基于当前的beta补丁v0.107.0)什么?!为什么?罪魁祸首是不同随机数发生器之间的意外关联——知道游戏中一个RNG的第一次输出会提供帮助预测其他所有RNG第一次输出的信息。《侵袭之塔2》的随机数发生器目前,我将对这种关联做一个极其简化的解释。如果你想要更多细节,我将在这篇文章的最后进行更深入的探讨。如果你不关心,可以跳过这一部分,查看下面所有有趣的例子。"相关RNG"(或"CRNG")的现象在《侵袭之塔》社区中已经为人所知,因为《侵袭之塔1》也存在类似问题,在Forgotten Arbiter的博客文章中有详细描述。简而言之,在《侵袭之塔1》中,游戏使用了多个不同的伪随机数发生器,以防止例如一场战斗中的随机性影响未来的卡片奖励。然而,它们都是初始化为相同的初始状态,这意味着它们生成相同的数字序列。因此,聪明的玩家可以关注以往随机事件的结果,从而获取有关未来随机事件的信息。为了避免同样的问题,《侵袭之塔2》将其伪随机数发生器初始化为不同状态。代码看起来类似于这样(为了教学目的而高度简化): Rng UpFront = new Rng(seed + hash("up_front")); Rng Shuffle = new Rng(seed + hash("shuffle")); Rng UnknownMapPoint = new Rng(seed + hash("unknown_map_point")); Rng CombatCardGeneration = new Rng(seed + hash("combat_card_generation")); Rng CombatPotionGeneration = new Rng(seed + hash("combat_potion_generation")); Rng CombatCardSelection = new Rng(seed + hash("combat_card_selection")); Rng CombatEnergyCosts = new Rng(seed + hash("combat_energy_costs")); Rng CombatTargets = new Rng(seed + hash("combat_targets")); Rng MonsterAi = new Rng(seed + hash("monster_ai")); Rng Niche = new Rng(seed + hash("niche")); Rng CombatOrbGeneration = new Rng(seed + hash("combat_orbs")); Rng TreasureRoomRelics = new Rng(seed + hash("treasure_room_relics")); // ... 还有很多随机数发生器在游戏中没有列出,为了简洁起见;特别是每个事件都有其自己的RNG。哈希函数从输入字符串生成一个"随机的"数字,但对于相同的输入,该数字始终是相同的。因此,思想是RNG状态被打乱,但相同的种子仍然会导致相同的运行。问题在于这些种子被传递给C#中的标准System.Random类。不幸的是,C#中使用的伪随机数生成算法几乎完全与初始种子“线性”相关。这到底意味着什么有点复杂——我将在这篇文章后面详细讨论。但其结果是,两个种子相差已知固定值的RNG输出差异较模糊但仍可利用的程度。你可能会问,如何利用?好吧... 这是CRNG的一大堆后果,从有趣但不重要到对游戏玩法的实际影响(其中一些甚至对不知情的普通玩家也影响很大!)。Neow的骨头我将从介绍中的第一个例子开始。如果你在下水道选择了Neow的骨头,你获得的“随机”诅咒实际上大致有以下分布:笨拙 0.10% 负债 54.25% 腐朽 40.32% 怀疑 1.50% 愧疚 0% 伤害 0% 正常 0% 后悔 0% 羞愧 0% 扭曲 3.82%然而,在过生长的地方,你得到的诅咒来自这个分布:笨拙 0.51% 负债 0% 腐朽 0% 怀疑 0% 愧疚 0.19% 伤害 5.53% 正常 1.18% 后悔 0% 羞愧 18.85% 扭曲 73.74% 对我来说这个实在是太有趣了——Reddit和Discord上的很多人都在感叹他们的运气太糟糕,总是在Neow的骨头中抽中负债。即使在发现CRNG之前,我看到一些帖子坚称这似乎比随机情况更频繁。我很难表达我大脑是如何立即将其自动驳回为教科书式的确认偏差。然而... 要理解这一点,我们需要关联三个随机性来源:来自Neow的“诅咒遗物”是通过调用Neow的事件特定RNG获得的,该RNG的种子是seed + 1 + hash("NEOW")。Neow选项中总是有来自"诅咒池"的确切一件遗物,如维基百科所述。选择提供的8个诅咒遗物中的哪一个是对Neow的RNG的第一次调用。来自Neow的骨头的随机诅咒则来自
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡