この記事は
Roguelike Advent Calendar 2025 の9日目の記事になります。
https://adventar.org/calendars/11418

あいさつ
どうもこんにちは、あるいはこんばんは、Bluetoothキーボードが壊れたベッキーさんです。
安価な中古のパソコンを買いそうになったけどWindows11を入れる裏ワザが使えなくなった!というニュースを見て、買わなくてよかったと安堵しました。つまり私用パソコンがまだないのです。
以上近況でした。
RNG
さて、擬似乱数というモノをご存知でしょうか。
「今どき未就学児でも知ってるよ(笑」
「こんなとこ見てて知らないわけないだろ(怒」
ごもっともでございます。
ローグライクの最重要な点の一つですね。
入るたびに違うダンジョン!アイテム!階段を降りたとき隣にいるモンスター!
きみのせいしはかかっている!サイコロに!
強い武器や防具をツモるのも乱数という名のサイコロ次第!永遠に続くガチャを回し続けるがよい!今なら永遠に無限連ガチャ無料!
とまぁ、ローグライクといえばランダム要素から最善手を選ぶ、またはレアアイテムを拾って歓喜する、また当然のように遭う大惨事(例えば魔力嵐を連発してたらリンギルがなくなるみたいな)、と、ランダムナンバーが楽しすぎるゲームであるのは否めないでしょう。真髄の95階で倒れた?また最初から遊べるね!
そして、この擬似乱数生成、ランダムナンバージェネレータ(RNG)にはもう一つの側面があります。
RNGに任意のシード値を入れると、続く数値、数値の連なりは必ず同じになる、というものです。シード値の性質を利用したゲームも昔からあります。最近だとマイクラのおかげで知れ渡りまくってそうですが。
簡単に例を挙げると「20億階まで続く、ランダム生成ダンジョンがあり、何度潜っても全く同じマップになっているゲーム」を作ることに利用できるシステムです。
「無限の迷宮」というWizardry風ダンジョンRPGが有名です。
フリーセル?何それ?
いや、ローグライクの話をしなくてはなりません。
今日はNetHackについてです。
さて、WindowsのオフィシャルのC言語では伝統的にRNGの「rand()関数を2で割った余り」が、ほば全ての場合で
1,0,1,0,1,0,…
と順番に出力されるという悪夢のような仕様がありました(まだある可能性も?)。直せばいいじゃんとは誰もが思いますが、前述の「全く同じマップになるゲーム」で、もしもこの関数を使っていたら……そしてこのrand()の実装がマイクロソフトによって変更されたら……20億階全てのマップが変わってしまいます。よってそう簡単に直せません。
フリーセル?何それ?
いや、NetHackだった。
NetHackでシード値による同一マップというシステムを書いた人は……いるかもしれません。いたかもしれません。いないかもしれません。覚えゲーと化したNetHackというのも面白いかも?
本題ですが、このNetHack(日本語版)の古い公式Windowsバイナリで奇跡が起きていました。
その昔、キャラメイクで属性がランダムにしか決められなかった頃(「エルフ」は職業の一種でした)、本来プリーストはランダムでL/N/Cの3つの属性のうちどれかになるはずが、Chaoticのプリーストが、絶対にプレイヤーキャラとして開始できないというものです。前述のRNGの仕様がゆえに、です。Windows以外ではおそらくChaoticになる可能性が普通にあった……と思われます。
混沌の僧侶。それがどうかしたのか?と言われればそれまでなのですが。
エルフや盗賊ならともかく(?)、僧侶で混沌の神の下僕(しもべ)というのは例えばハーゴンやサウロンみたいなモノじゃないですか?それが半神になるのは善くないよねぇ。まぁぼくも変愚蛮怒の混沌の戦士みたいなロールプレイは好きだけど……
結局のところ……
意図せずに、混沌の使徒を使えなくしてしまったWindowsという奇跡!
の紹介でした。
ではまた。
オマケ
自作アクションゲーム「とても怖いところ」
https://www.freem.ne.jp/win/game/4093
このゲームでも固定乱数(?)を使っています。
Denziさんの古地図風背景も見どころ。
すごい勢いでガイコツとカタツムリが襲ってきますが、毎回同じルートを同じモンスターが通過していくので、毎回同じムーブをすれば毎回同じように避けることができます。アイテムを取ると毎回1UPするぞ!頑張って仏像輪投げまでたどり着こう!
最新のOSで動くかはわかりません。
VirtualBoxというソフトが助けになる……かどうかもわかりません。



















