ディスカッション (11件)
『Slay the Spire 2』で採用されている「相関乱数(Correlated randomness)」の仕組みに関する考察トピックです。詳細な議論はこれから深まっていくものと思われます。
面白いことに、StS2がこの問題に直面したのはGodotでC#のSystem.Randomを使っていたからなんだよね。ちなみにGDScript(Godot Engine独自のスクリプト言語)のRNGクラスはPCG32を使ってるから、この種の問題は起こらないはずだよ。
すごくいい記事だね!「なんでいつもこのカードばかり出るんだ?」って思うようなプレイが何度もあったけど、これで納得だよ!ありがとう!
これってMinecraftで、地表の粘土を見つけて、そこからXブロック横に移動して真下に掘るとダイヤモンドが見つかるっていう現象の原因と同じだね。
「C#の標準ライブラリを呼ぶ代わりにコードベース内でPRNGを実装することには、シードがすべてのプラットフォームで確実に同じになるというメリットがある。Spire 1では、標準ライブラリのPRNG実装がプラットフォーム間で異なっていたため、デスクトップ版とモバイル版でシードが違っていた。また、標準ライブラリの実装は将来的に変更される可能性があり、そうなると過去のシードがすべて無効になってしまう点も言及しておく価値がある」
これが正しい結論だね。ゲーム開発者は、ゲームプレイに関連する乱数生成器をプラットフォーム依存のコードではなく、ゲームプレイコードの一部として考えるべきだよ。
「相関乱数(CRNG)」という現象の呼び方はかなり面白いね。CRNGというと「暗号学的擬似乱数生成器(Cryptographic Random Number Generator)」を指すこともあるけど、そっちはこの相関の影響を受けないからね。まあ、一般的にはCSRNGの方が通りがいいと思うけど。
この記事と初代Slay the Spireのクリア不能なシードに関する発見[0]を合わせると、ずっと疑問に思ってた「RNG地獄」の存在を考えちゃうね。ゲームが時刻を乱数シードに使っていて、ハッシュ関数とゲームメカニクスの癖が重なったせいで、(例えば)4日間ずっと何をやってもクリア不可能になるみたいな。実際、自分もそんな目に遭ってる気がすることがあるんだよね!
記事を全部読む時間はなかったけど、HackerNewsを読んでいてSTS2をプレイしている層の広さには本当に感謝だね。STS1とSTS2はお気に入りのゲームだから、ここでこの記事を見つけてすごく嬉しくなったよ。共有してくれてありがとう。
「(ちなみに、2階層のCorpse Slugが両方とも1ターン目に攻撃してくる確率は3%未満。なんて親切な奴らなんだ!)」
あれって確定行動だと思ってたよ。まさかゲーム側でそんな挑戦的な挙動を許容してたなんてね :(
そもそも、なぜ複数のRNGを使う必要があるのか理解できないんだよね。ゲーム全体で共通の、シード可能な乱数生成源が1つあれば、この問題は解決するんじゃないの?
チャレンジラン用にシード探索をしていてたまたま見つけたんだけど、シードは32ビットのハッシュ関数を通るから、実質的にシード値は40億通りしかない(64ビットシードだった初代とは違ってね)。クリア不能なシードが存在するかどうかを証明・反証するような作業には全通りブルートフォースできるから最適だけど、その代わり楽しい「高効率」なシードランの可能性はかなり低くなるね。今作は初代よりもずっとバリエーションが豊富なのに、それはちょっと残念かな。
最終的にクリアできたチャレンジランがこれ(アセンション10、カードを1枚も取得せずに勝利) https://youtu.be/PbP284CZrZ4?is=iL1E7gIzj_kgx0MS