HN🔥 272
💬 86

『Slay the Spire 2』における相関乱数の仕組みを紐解く

rdmuser
1日前

ディスカッション (11件)

1
stdc105
1日前

面白いことに、StS2がこの問題に直面したのはGodotでC#のSystem.Randomを使っていたからなんだよね。ちなみにGDScript(Godot Engine独自のスクリプト言語)のRNGクラスはPCG32を使ってるから、この種の問題は起こらないはずだよ。

2
FromTheFirstIn
1日前

すごくいい記事だね!「なんでいつもこのカードばかり出るんだ?」って思うようなプレイが何度もあったけど、これで納得だよ!ありがとう!

3
iliveinberlin
1日前

これってMinecraftで、地表の粘土を見つけて、そこからXブロック横に移動して真下に掘るとダイヤモンドが見つかるっていう現象の原因と同じだね。

4
account42
1日前

「C#の標準ライブラリを呼ぶ代わりにコードベース内でPRNGを実装することには、シードがすべてのプラットフォームで確実に同じになるというメリットがある。Spire 1では、標準ライブラリのPRNG実装がプラットフォーム間で異なっていたため、デスクトップ版とモバイル版でシードが違っていた。また、標準ライブラリの実装は将来的に変更される可能性があり、そうなると過去のシードがすべて無効になってしまう点も言及しておく価値がある」

これが正しい結論だね。ゲーム開発者は、ゲームプレイに関連する乱数生成器をプラットフォーム依存のコードではなく、ゲームプレイコードの一部として考えるべきだよ。

5
jszymborski
1日前

「相関乱数(CRNG)」という現象の呼び方はかなり面白いね。CRNGというと「暗号学的擬似乱数生成器(Cryptographic Random Number Generator)」を指すこともあるけど、そっちはこの相関の影響を受けないからね。まあ、一般的にはCSRNGの方が通りがいいと思うけど。

6
jcalx
1日前

この記事と初代Slay the Spireのクリア不能なシードに関する発見[0]を合わせると、ずっと疑問に思ってた「RNG地獄」の存在を考えちゃうね。ゲームが時刻を乱数シードに使っていて、ハッシュ関数とゲームメカニクスの癖が重なったせいで、(例えば)4日間ずっと何をやってもクリア不可能になるみたいな。実際、自分もそんな目に遭ってる気がすることがあるんだよね!

[0] https://oohbleh.github.io/losing-seed/

7
kami23
1日前

記事を全部読む時間はなかったけど、HackerNewsを読んでいてSTS2をプレイしている層の広さには本当に感謝だね。STS1とSTS2はお気に入りのゲームだから、ここでこの記事を見つけてすごく嬉しくなったよ。共有してくれてありがとう。

8
darepublic
1日前

「(ちなみに、2階層のCorpse Slugが両方とも1ターン目に攻撃してくる確率は3%未満。なんて親切な奴らなんだ!)」

あれって確定行動だと思ってたよ。まさかゲーム側でそんな挑戦的な挙動を許容してたなんてね :(

9
antitoi
1日前

そもそも、なぜ複数のRNGを使う必要があるのか理解できないんだよね。ゲーム全体で共通の、シード可能な乱数生成源が1つあれば、この問題は解決するんじゃないの?

10
chriskw
約19時間前

チャレンジラン用にシード探索をしていてたまたま見つけたんだけど、シードは32ビットのハッシュ関数を通るから、実質的にシード値は40億通りしかない(64ビットシードだった初代とは違ってね)。クリア不能なシードが存在するかどうかを証明・反証するような作業には全通りブルートフォースできるから最適だけど、その代わり楽しい「高効率」なシードランの可能性はかなり低くなるね。今作は初代よりもずっとバリエーションが豊富なのに、それはちょっと残念かな。

最終的にクリアできたチャレンジランがこれ(アセンション10、カードを1枚も取得せずに勝利) https://youtu.be/PbP284CZrZ4?is=iL1E7gIzj_kgx0MS