この記事はRoguelike Advent Calendar 2024 の12日目の記事です
この記事を読んでいるそこの君、まだまだカレンダーは余裕があるぞ!
「Necrodancer踊ってみた」でも「シレン6買ってみた」でも何でもいいから書くんだ!

ということで改めましてこんにちは、Hourierです
今日はモンスター生成ルーチンを読み解いてみましょう
本体がmonster-list.cpp のget_mon_num() にある他、生成禁止モンスターをフィルタする処理が別途あります
但し、フィルタの話まですると面倒になるのでここでは抜きにします
例1:地上専用モンスターはダンジョンに出現させない
例2:オークの洞窟ではオークの出現率を上げる

モンスター分布は、実のところ出現階層とレアリティだけで決まります
ここでは例としてモンスターを8体用意します
これまた話を簡単にするため、1Fと2Fだけにします
後ろの数字はレアリティ値です
コード上、厳密には「確率値 = 100/レアリティ (小数点未満切り捨て)」を使うのですが、面倒なのでこのまま行きます
1F:1A(1)、1B(1)、1C(2)、1D(3)
2F:2A(1)、2B(1)、2C(2)、2D(3)

変愚蛮怒プレイヤーの方なら、「モンスターのレアリティ値が大きければ出会う確率が低い」というのは感覚的に分かるかと思います
V2の頃は「おまぬけトロル3人組」のレアリティは7でした (今は3)
狙わない限り3人全員撃破、とはならないはずです
ではどういうルーチンかというと、ざっくり言って「レアリティNのモンスターは、レアリティ1のモンスターに比べて出現率が1/Nである」です
(ざっくりなのは確率値が切り捨てであるため)

従って、1Fに出現するモンスターの分布は、レアリティから最小公倍数を求めるとこうなります
即ち1Cは1A&1Bの1/2、1Dは1Aの1/3です
1A:6体
1B:6体
1C:3体
1D:2体

上記を合計すると、6 + 6 + 3 + 2 = 17 です
レアリティ1のモンスターだけで各6/17 ≒ 35.3% 、2体合計で70%以上という高確率で出現します
レアリティ2のモンスターは3/17 ≒17.5%、そしてレアリティ3のモンスターは2/17 ≒ 11.8% です
実際はレアリティ1や2のモンスターはもっと沢山いるので、レアリティ6の『グレーター・ヘル=ビースト』は実のところ相当に出現確率が低いです
「レアリティ1は頻繁に見かける、2はそこそこ、3はレア、4以上は滅多に見かけない」というのはこのルーチンによります

さて、2F以降はどうなるでしょうか
2Fにも1Fのモンスターが出現するのは、変愚蛮怒プレイヤーの方にはおなじみですね
何なら127Fまで潜っても1Fのモンスターは低確率ながらいる時はいます
この分布はランダムに決まります

フロアとは無関係にレアリティだけで選ぶ:40% (1:1:1:...)
フロアに線形比例して確率が上がる:50% (1:3:5:...)
フロアに2乗比例して確率が上がる:10% (1:7:19:...)
となります
一番上の「40%」が選択されれば、127Fでもレアリティ1ならざっくり1/127 の確率で選ばれることになります
(実際は上記の通りモンスターテーブル全体の影響を受けるので単純計算にはなりませんが、概念的に)

一番確率の高い50% の場合を考えてみましょう
この場合、n階でレベルk (但しn ≧ k)のモンスターが選択される確率は「(2k-1)/(n^2)」です
特に、n階でレベルnのモンスターが選択される確率は「(2n-1)/(n^2)」です
(変数の次元は、分子が1で分母が2なので差し引き1次、即ち線形比例)

10Fでレベル10のモンスターが選択される確率は、(2*10-1)/(10^2) = 19/100 ≒ 1/5
30Fでレベル30のモンスターが選択される確率は、(2*30-1)/(30^2) = 59/900 ≒ 6.6%

おや、30Fで30Fのモンスターはあまり出てきませんね?
鉄獄を高速に駆け下りられる時とそうでない時がありますが、モンスターが闇鍋ガチャになりやすいだけでなく、深ければ深いほど階層より低いレベルのモンスターが出る確率が高いためでもあります
ちなみにこれをどう補正しているかというと、「部屋ブースト」です
端的には、ブーストのかかった部屋を避けると高速潜行できます

一部の部屋は、「+2F」であるとか「+5F」などのブーストがかかっています (部屋の形で判別できますが、この記事では紹介しきれないのでスキップ)
有名なのはVaultの「+40F」です
「+5F」は鉄獄のそこかしこでフツーに生成されるので、これをもって考えてみましょう

10Fでレベル10以上のモンスターが選択される確率:
(2*15-1 + 2*14-1 + 2*13-1 + 2*12-1 + 2*11-1 + 2*10-1)/(15^2)
=(30+28+26+24+22+20 - 5)/225
=145/225 ≒ 64.4%

30Fでレベル30以上のモンスターが選択される確率:
(60+58+56+54+52+50 - 5)/900
= 約36.7%

なんと! 数倍に跳ね上がりました!
当然ですが2乗比例モードを引くと更に確率が上がります
逆に、イークの洞窟は「部屋ブーストをキャンセルする処理」が入っているので、現階層以上のモンスターは絶対に出現しません
「イーク洞は簡単」というのはつまりこういうことなのです
当然、nasty生成 (ゲーム内日数に応じた階層ブースト)がかかるともっと確率が上がります

さて、これを元に「2Fのモンスター分布」を考えてみましょう
引き続き線形比例モードで考えてみます
上記より「2Fのモンスターは3/4、1Fのモンスターは1/4の確率で生成される」ことになります
2Fでレアリティ1のモンスター、2Aと2Bはそれぞれ約26.5% です
一方、1Fでレアリティ3のモンスター、1Dの出現確率は……なんと3%弱!
8種類しかいないサンプル分布ですらこれなので、実際の闇鍋ガチャではほとんど見かけないですね

ところで、2Fにいるユニークでおなじみの『おおかみ』などの犬類はレアリティ2なので、『フリージア』の1より出現率が低いです
しかしフリージアは1であるが故に3F以降でもそこそこ見かけますが、おおかみは3Fくらいならともかく6Fまで潜ってしまうと出現率が1桁%に落ちるので、まず見かけなくなります
これは以下のように計算できます

6Fに2Fのモンスターが出る確率:(2*2-1)/36 = 3/36 となり1/10未満
レアリティ2なので単純計算で半分とすると、ほぼ4%

更にここから、以下のことが言えます
「プレイヤーがN階にいる時、N階に出現するレアリティ2のモンスターと、N/2階に出現するレアリティ1のモンスターは、概ね同じ確率で出現する」です
階層が低いと分子の-1が効きますが、20Fのレンジャー(レアリティ1)と40Fの達人超能力者(レアリティ2)は、40Fを長時間うろつけば概ね同じくらいの回数戦うことになります
(40%の確率でレンジャーの方が高くなり、10%の確率で達人超能力者の確率が高くなり、ブーストがあって……と全部考え合わせても、極端にどっちが出現率高いとは言いにくい)
確率はあくまで確率ですが、モンスター分布の平均値やブースト時の危険性が数学的に紐解けると覚えておくと、何%の確率でやべーのと出会ってしまうか概算できて論理的なプレイができるかと思います


この記事は以上です、お付き合い頂きありがとうございました!