
2026/06/16 18:46
スレイ・ザ・スパイル 2 の相関したランダム性
RSS: https://news.ycombinator.com/rss
要約▶
日本語翻訳:
以下が、重要なポイントリストからの量的詳細と具体的な例を統合しつつ、核心的メッセージは保ったまま改定されたバージョンです:
改善された要約
本質的な問題は、2 つの異なるバージョン(Underdocks と Overgrowth)を持つ最終ボス遭遇にあります。これらはソフトウェアバグのため、 loot の確率に大幅な差が生じています。ゲームはエンタルピー混合が不十分な線形擬似乱数生成器 (PRNG) に依存しており、特定の呪い(Precarious Shears の収集など)の収集や New Leaf の出現といった早期ゲームでの選択が、後にドロップレートを不当に支配する原因となっています。
この失敗の具体的な例としては:Underdocks では最初の戦闘でポーションのドロップ確率が 76% に対して Overgrowth ではわずか 4% であること、Trash Heap で Rebound リリクを不可能にし、かつ呪いプールの選択がペア出現に強く影響すること、特定のアイテム収量が著しく異なること(例:Large Capsules は Underdocks で約 37% のレアドロップ対して Overgrowth で約 70%)などが挙げられます。また、影響を受けたメカニズムには Leafy Poultice と New Leaf の変身可能性、Arcane Scroll カードの収量、Doll Room の結果確率(Underdocks で約 62% Bing Bong 対して Overgrowth で約 96%)、Ancient の報酬相関(Precarious Shears を使用した Tezcatara が Nutritious Soup を 88.75% の確率で提供する)なども含まれます。
これを解決するためには、開発者は非線形アルゴリズム(PCG32 など)またはカウンターベースの生成器に線形生成器を置き換え、プレイヤーの行動に関わらず予測不可能で公平な結果を確保する必要があります。このパッチがリリースされるまで、プレイヤーは特定のパターンボスバージョンに対して不利となる歪んだ確率に直面することになります。この事例は、機械的な差異が意図されたデザインを反映していることを保証するため、乱数化システムに対する厳格なテストの必要性を強調しています。
本文
スレイザスパイアー 2(シングルプレイヤー版)における真実と CRNG の問題
はじめに
スレイザスパイアー 2 の単独プレイモードには、予期せぬ乱数発生器(RNG)間の相関関係が存在します。これは、ゲーム内の異なる RNG が同じ初期状態(シード値)から開始されるため、あるランダム事象の結果を知らなければならなくなってしまう「予兆現象」を指します。
- 重要: この記事の情報は、現在のベータパッチ v0.107.0 に基づいています。
- 前提条件: 以下の記述は、ニウ(Neow)が追加遺物やカードを生成しない通常の状態を仮定しています。
3 つの主な事実(導入部)
- 「ニウの骨」選択の影響
- アンダードックスで「ニウの骨」を選ぶ場合、ランダムな呪約として得る**「負債(Debt)」の確率は約 54%**と高くなります。
- ※前提:遺物として「新緑(New Leaf)」または「 kaleidoscope」が出ること(通常)を仮定します。
- 「ごみ山」イベントの制限
- イベントからカード**「リバウンド(Rebound)」」を得ることは、現在のバージョンでは不可能です。**
- 薬ドロップ確率の格差
- アンダードックスでは初戦で薬をドロップする確率が**76%であるに対し、オーバーグロウスではわずか 4%**です。
CRNG の仕組みと原因
ゲームが持つこの「予兆現象」は、以下の技術的要因によって発生しています。
- 擬似乱数発生器(PRNG)の共有
- スレイザスパイアー 1 では、異なる目的のための複数の RNG が使用されましたが、これらはすべて同じシード値で初期化されていました。
- これにより、すべての RNG は同一の数字列を生成し、「過去のランダム事象から将来を予測」できるようになっていました。
- スレイザスパイアー 2 の改善と依然として残る欠陥
- スパイヤー 2 では、各用途のために異なるシード値(
)で RNG を初期化するようコードが書き換えられました。seed + hash("name") - しかし、このシードは .NET の標準クラス
に渡されます。System.Random - この標準ライブラリの実装には**「初期シードに対する線形性(Linear)」**という欠陥があり、固定量の差分を持つシード値に対して、その出力も同様の差を持つことが確定しています。
- スパイヤー 2 では、各用途のために異なるシード値(
具体的な事例とゲーム内への影響
1. ニウの骨(Neow's Bones)
- 現象: アンダードックスで「ニウの骨」を選択した場合、「負債(Debt)」が圧倒的に頻繁に出現します。
- 原因:
- 「呪約遺物」の選択は、
シードの RNG から発生。seed + 1 + hash("NEOW") - 最終的な呪約の生成は、
シードの RNG(Niche)から発生。seed + hash("niche") - 「アク 1(アンダードックスまたはオーバーグロウス)」の決定は、別の独自の RNG 呼び出しから発生。
- 「呪約遺物」の選択は、
- 結果: ニウの選択肢が固定範囲内にあるため、呪約プールの選択に強い偏りが生まれ、「負債」以外の遺物(例:器用さ欠如など)が出ないケースが多いです。
2. 大型カプセル(Large Capsule)
- 現象: 大型カプセルを引く際、アンダードックスで「Rare(レア)」が出る確率(約 63%)が異常に高い。
- 原因: ニウの骨と同様のシード相関により、遺物自体が良い状態(レア度が高い)になりやすいバイアスが働きます。
- 影響: この現象自体は重要ですが、ニウでの呪約プールオプションの特定の分布は以下の通りです。
- アンダードックス: CursedPearl, HeftyTablet, LargeCapsule, LeafyPoultice, NeowsBones, PrecariousShears, SilkenTress, SilverCrucible
- オーバーグロウス:同じ構成(※ゲームバランス的に奇妙です)。
3. 小型カプセル(Small Capsule)と他遺物
- 現象: 小型カプセル自体は呪約プールに属さないため直接的なバイアスはないが、他の遺物の出現分布によってレアリティを予測できる。
- アンダードックス:通常
をドロップ。Common - オーバーグロウス:通常
またはUncommon
をドロップ。Rare
- アンダードックス:通常
- 他遺物(Leafy Poultice, Hefty Tablet など):
- これらの遺物は複数のカードを生成するため、最初の転換先のみが予測可能です。
- 例:**「葉ずみ poultice(Leafy Poultice)」**の最初の転換候補は 80 カード中わずか 22 パターン(一部キャラクターでは利用不可能)。
4. ランダムな攻撃ターゲットとオーブ
- 現象: 稲妻オーブ(Lightning Orb)がどちらに命中するかを事前に予測可能。
- アンダードックスの初戦では、左側の敵に**75%**の確率で命中します。
- 特定の呪約(例:SilkenTress)が見えた場合、その命中率はさらに偏ります(例:>95%)。
5. ごみ山(Trash Heap)イベント
- 現象: アンダードックス限定で、カード**「リバウンド」**は一切出ません。
- 予測リスト: 遺物によって出現するカードが完全に決まります。
- 例:遺物が
の場合、CursedPearl
の確率は 66.63%、HelloWorld
は 32.26% など。Outmaneuver
- 例:遺物が
6. 「?」部屋の出現率
- 現象: 初戦で薬をドロップする頻度が偏っており、これにより**「?」部屋が戦闘イベントになる確率も予測可能。**
- アンダードックス:約 9.6% の確率で戦闘イベント。
- オーバーグロウス:約 10.4% の確率で戦闘イベント。
さらに深く:人形室と古代の報酬(Ancient)
人形室(Doll Room)
- 現象: アク 2 で出現するこのイベントでも、独自の RNG が使われますが、前述の初回ロールと相関します。
- 「一人の人形」選択肢:
- アンダードックス:約 62% で「Bing Bong」、約 4% で「Daughter」。
- オーバーグロウス:上記の逆(Daughter と Struggles の出現確率が高い)。
- 戦略:
を引けばHefty Tablet
、Mr. Struggles
を引けばPrecarious Shears
がほぼ確定します。Bing Bong
古代の報酬(Ancient Rewards)
- 現象: 古代出現時に得られる選択肢も予測可能ですが、主に初戦ゴールド量やPael/Tezcatara のオプションに関連します。
- 例:Pael の場合、11 ゴールドを出した場合は「クローン夢」は諦めるべきでしょう。
- Tezcatara の場合、「栄養のあるスープ」を選ぶ確率が 88.75% に跳ね上がります(遺物
を持っていた場合)。Precarious Shears
全体的な初回ロール一覧(予測可能項目)
以下の全ての事象は、初回のロール結果が分かれば他も推測可能です。
- アク 1 のバージョン(アンダードックス vs オーバーグロウス)
- ニウの呪約プール遺物
- ショップで最初に出現する
級遺物Common - 初戦で最後の引かれたカード
- 最初の「?」部屋の内容
- 戦闘中に生成される最初のカード(例:攻撃薬)
- 最初にランダムに選ばれるエネルギーコスト
- 最初にランダムに選ばれた敵(例:稲妻オーブ)
- 初回モンスターの AI 出現パターン
- 初回の「niche RNG」結果(例:砥石)
- ごみ山または混沌で生成された最初のオーブ
- 初戦で薬がドロップするかどうか
- 最初のショップで販売されているカード
- Pael または Tezcatara のオプション 1 と 2
- 葉ずみ poultice の最初の転換先
開発者への嘆願書:なぜ修正が必要か?
この問題は単なる「奇跡」ではなく、ゲームプレイに深刻な影響を与えるバグです。
- 不合理性: カード「リバウンド」を永久的に見ることができないなどは、戦略要素の欠落を意味します。
- バランス崩壊: 「ニウの骨」から常に有害な呪約が出るのは意図的ではありません。
- 修正の容易さ: 問題の原因は
の線形性にあります。これを非線形の擬似乱数生成器(例:PCG32)に書き換えるだけで、すべての相関関係は即座に解消されます。コード変更量は非常に少なく(3〜50 行)、早期アクセス段階である現在であれば修正可能です。System.Random
付録:なぜそうなるのか?(技術的解説)
シードの線形性と結果
System.Random クラスの内部構造には、以下の特性があります。
- 出力はシード値
の絶対値に対して線形関数です:$Output = x \cdot S + y$S - これは、異なる RNG を作るときに「固定量のオフセット(差分)」を与えられます。
- シード
で作った RNG の出力は $A$S - シード
で作った RNG の出力は $B$S+1 - 差 $A - B = x$ は常に一定の値になります。
- シード
C# 実装の詳細
以下のコード片が、この線形性の根源です(簡略化)。
// コンストラクタ内で SeedArray が初期化される private int[] SeedArray = new int[56]; int subtraction = Math.Abs(Seed); // シードの絶対値を使う // ... (複雑な計算 ...) // 実際の乱数生成関数 private int InternalSample() { return SeedArray[locINext] - SeedArray[locINextp]; // 引算のみ }
ここでの
SeedArray の初期化は、シード値 S を元に計算されており、すべての要素が S の線形結合($x \cdot S + y$)として表せます。その後の「引算」演算も、2 つの線形式を引くだけなので、結果も依然として線形性を保持し続けます。
修正提案
- 非線形化: シード生成時に単純な足し算ではなく、乗算やハッシュ関数を使用する。
- PRNG の採用: .NET の標準ライブラリに依存せず、より現代的で安全なアルゴリズム(例:PCG32)を実装する。これによりシードの線形性バイアスを排除できます。
この記事は、CRNG 現象の発見とゲームバランスへの影響を正しく認識し、開発者に修正を求める意図に基づいて作成されています。