← 返回信息流
AI 资讯Hacker News·4 小时前

《杀戮尖塔2》中的相关随机性机制解析

原标题:Correlated randomness in Slay the Spire 2

速览

本文分析了游戏《杀戮尖塔2》中采用的相关随机性(Correlated randomness)技术。该机制旨在优化游戏内的随机事件生成逻辑,提升玩家体验的公平性与策略深度。通过算法调整,游戏能在保持随机性的同时避免极端不利情况的发生。

AI 深度解读

Slay the Spire 2 中的相关性随机数生成(CRNG)深度解读

背景

在《杀戮尖塔 2》(Slay the Spire 2,以下简称 Spire 2)的单人游戏模式中,玩家可能会发现一些看似违背直觉的概率现象。例如,在“下码头”(Underdocks)选择“尼奥的骨头”(Neow's Bones)时,获得“债务”(Debt)诅咒的概率约为 54%;而在某些事件中,根本不可能获得“反弹”(Rebound)效果;首战掉落药水的概率也因地图区域不同而存在显著差异。

这些现象并非单纯的运气好坏,其根源在于游戏底层随机数生成器(RNG)之间的相关性(Correlation)。这一概念在《杀戮尖塔 1》(Spire 1)社区中已有讨论,但在 Spire 2 中以一种更隐蔽且影响深远的方式呈现。本文基于 Hacker News 上的技术讨论,结合当前 Beta 版本 v0.107.0 的代码逻辑,深入解析这一现象。

核心内容

1. 随机数生成器的演变与缺陷

在 Spire 1 中,为了防止战斗内的随机性影响未来的卡牌奖励,游戏使用了多个独立的伪随机数生成器(PRNG)。然而,这些生成器都被初始化为相同的起始状态(Seed)。这意味着它们会产生完全相同的数字序列。精明的玩家可以通过观察过去的随机事件结果,预测未来的随机事件。

为了解决这个问题,Spire 2 的设计者试图让每个 PRNG 使用不同的初始状态。代码逻辑大致如下(为教学目的简化):

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,每个都基于基础 seed 加上不同的哈希字符串

这里的 hash 函数旨在为每个 RNG 生成一个看似随机但确定性的偏移量。理论上,这应该打乱 RNG 的状态,确保即使种子相同,不同模块的随机序列也是独立的。

问题出在哪里? 当这些种子传递给 C# 标准库中的 System.Random 类时,问题暴露了。C# 的 System.Random 算法在起始种子方面几乎是完全线性的。这意味着,如果两个 RNG 的种子相差一个已知的固定量(例如通过哈希函数计算出的偏移量),它们的输出结果虽然不会完全相同,但会存在一种模糊但可被利用的相关性。简单来说,知道其中一个 RNG 的第一个输出,就能提供关于其他所有 RNG 第一个输出的预测信息。

2. 具体案例解析

A. Neow's Bones(尼奥的骨头)与诅咒分布

这是最直观的影响案例。在“下码头”(Underdocks)选择 Neow's Bones 时,获得的“随机”诅咒并非均匀分布。

  • 机制关联

    1. Neow 的事件 RNG 决定了提供哪个诅咒遗物(从 8 个诅咒遗物中选 1)。
    2. Neow's Bones 的诅咒来自 RunState.Rng.Niche,其种子为 seed + hash("niche")
    3. 第一幕变体(Underdocks 或 Overgrowth)由另一个基于基础种子的 RNG 决定。
  • 相关性后果: 由于 Neow's Bones 属于 Neow 的“诅咒池”,只有当 Neow 的 RNG 滚出特定范围时才会出现。这一条件对 Niche RNG 的第一个调用范围施加了强约束。

  • 结果

    • 在 Underdocks,获得“债务”(Debt)的概率高达 ~54%。
    • 在 Overgrowth,诅咒分布则完全不同。
    • 这导致 Neow's Bones 实际上是一个更差的遗物,因为它极少给出“笨拙”(Clumsy)、“内疚”(Guilty)等轻度诅咒,而频繁给出“债务”等致命诅咒。

B. Large Capsule(大胶囊)与 Small Capsule(小胶囊)

遗物的稀有度也受到了相关性的影响。

  • Large Capsule
    • 它永远不会掉落普通(Common)稀有度的遗物。
    • 在 Overgrowth 中,约 70% 概率为稀有(Uncommon),30% 为史诗(Rare)。
    • 在 Underdocks 中,约 37% 为稀有,63% 为史诗。
    • 注意:由于所有随机性相互关联,Large Capsule 在 Underdocks 出现的总概率仅为约 1.65%。
  • Small Capsule
    • 虽然它本身没有内在偏差,但我们可以利用 Neow 的诅咒池遗物来预测 Small Capsule 的稀有度。
    • 经验法则:在 Underdocks 中,Small Capsule 通常给出普通遗物;在 Overgrowth 中,通常给出稀有或史诗遗物。

C. 其他遗物与事件

  • Leafy Poultice(叶敷药膏)和 Hefty Tablet(重片剂): 这些属于“变换 2”或“选择稀有”的遗物。由于它们也是诅咒池遗物,具有内在偏差。但由于它们生成多张卡牌,我们只能预测第一张卡牌的结果。
  • Rebound(反弹): 从 Trash Heap 事件中不可能获得 Rebound,这是由 RNG 状态的相关性导致的硬性限制。

关键要点

  • 根本原因:C# System.Random 算法对种子的线性敏感性,导致即使使用不同的哈希偏移量初始化,多个 PRNG 之间仍存在可预测的相关性。
  • Neow's Bones 的陷阱:在 Underdocks 中,Neow's Bones 极大概率(~54%)给出“债务”诅咒,使其成为高风险遗物。
  • 稀有度偏差
    • Large Capsule 永远不会掉落普通遗物。
    • Small Capsule 的稀有度与当前地图区域(Underdocks/Overgrowth)及 Neow 的诅咒池状态强相关。
  • 不可预测性的假象:玩家感知的“运气不好”(如频繁获得债务)实际上是算法结构导致的系统性偏差,而非随机波动。
  • 适用范围:上述数据基于 Beta 版本 v0.107.0,且假设未选择 New Leaf 或 Kaleidoscope 等会破坏相关性的特定遗物。

意义与影响

1. 对游戏平衡性的挑战

相关性随机数生成(CRNG)并非单纯的“彩蛋”,它实质性地改变了遗物的期望价值。Neow's Bones 在特定地图下的表现远低于其表面描述,而 Large Capsule 则意外地变得更强(因为排除了普通遗物)。这种偏差对于不了解机制的休闲玩家来说,会导致游戏体验的不可预测性和挫败感。

2. 玩家策略的深化

对于硬核玩家而言,理解 CRNG 意味着可以将“运气”转化为“信息”。通过观察早期随机事件(如 Neow 的选择、首战掉落),玩家可以推断后续事件的潜在结果,从而做出更优的决策。这增加了游戏的策略深度,但也可能破坏“随机性”带来的惊喜感。

3. 技术层面的警示

这一案例揭示了在游戏开发中使用标准库随机数生成器时的潜在陷阱。简单的“哈希加种子”策略不足以打破线性算法的相关性。开发者可能需要引入更复杂的熵源或非线性混合算法,以确保不同游戏模块间的随机独立性。

4. 社区反应

Reddit 和 Discord 社区中关于“运气差”的抱怨,在 CRNG 被发现后得到了解释。这提醒开发者,当玩家感知到异常概率时,背后往往隐藏着技术实现上的细节问题。透明的技术披露或后续的补丁调整,对于维持玩家信任至关重要。

查看原文 →tck.mn