ゲーム中で何がどのくらいの確率で起きるのかをある程度把握するための覚え書き。

rnd.cはNetHackの乱数生成周りの処理が実装されているファイルである。
なお、標準rand()関数の返り値の剰余を取ったものを基本的な乱数として扱うため乱数の質としてはあまりよくない。
そこらへんが気になる人は乱数生成にMT法を用いるパッチを適用するといいかもしれない。

以下に、rnd.cの関数について記述する。
なお、括弧内のxは基本的に0以下であってはならない。(例外は後述)
またこれらの関数は全て整数値を返す。

rn2(x)

離散型一様分布。範囲は 0 <= rn2(x) < x。

  • つまり0からx-1までの整数値を返す。

if(!rn2(x)){ ... } の形で多用される。(この場合、中括弧内が1/xの確率で実行される)

rnd(x)

離散型一様分布。範囲は 1 <= rnd(x) <= x。

  • つまり1からxまでの整数値を返す。要するに rnd(x) = rn2(x)+1 ということ。

d(n, x)

ダイス表記で言うところのnDxを返す。範囲は n <= d(n, x) <= n*x。

  • ちなみにこの関数では、nが0である時に限りxも0 (つまりd(0, 0))とすることが認められている。

rnl(x)

基本的にはrn2(x)に似ており、範囲も同様の 0 <= rnl(x) < x。
だが、幸運値によって分布が偏るようになっている。
幸運なら数値が小さく、不運なら数値が大きくなりやすくなる。(xがある程度大きい場合)

代表的な(固定しやすい)幸運値に対してrnl(x) → 0となる確率を以下に示す。

x
2345〜1516〜


0*11/x
1079/8059/60157/(40*x)430/(40*x)
1373/74109/111145/148181/(37*x)505/(37*x)

rne(x)

主に、祝福された/呪われた自然生成物の強化値算出等に使われる関数である。
1〜「5と現レベル/3のうち大きい方」の範囲の値をとる。

内部でrn2(x) → 0となるたびに+1される。
例えば、初期装備の指輪の強化値が+5 (rne(3) → 5) となる確率は(1/3)^4 = 1/81である。
Lv30ではそこらに+10のアイテムが生成される確率がないでもないが、期待はできない(というか自然生成物に頼るような進行状況ではないだろう)。

rnz(x)

祈りの際などの残り時間算出に使われる関数である。
分布が複雑なため詳細を知りたければWikihackの記事を参照されたし。

rn1(x, y)

これはrnd.cではなく、include/hack.h にて定められている。
rn2(x)にyを加えた値を返す。なおyは0以下であっても構わない。

関連リンク