This explanation is currently available in Japanese.
ひとことで
平均の近くの値がいちばん多く出て、外れるほど急にまれになる、つりがね形の分布(正規分布、ガウス分布)に従う乱数の作り方です。銃弾の散らばり、ダメージのぶれ、キャラクターの身長の個体差など、自然なばらつきの多くはこの形をしています。一様な乱数では「中心に集まる」感じが出ません。代表的な作り方が、2 つの一様乱数から 2 つの正規乱数を作るボックス=ミュラー法です。
ゲームでの使いどころ
- 弾のばらつき・反動:狙いの中心に多く当たり、たまに大きく外れる散らばり。撃ち続けると を大きくして精度を落とす。
- ダメージ・能力値のぶれ:「平均 100、たいてい 90〜110」のような値。一様乱数より平均の近くに集まり、極端な値がまれになる。
- 群れや配置の個体差:木の高さ、群衆の歩く速さ、草の傾きに少しずつ違いを付ける。
- 動きの揺れ:手ぶれ、カメラの揺れ、AI の狙いの誤差。
しくみ
平均 、標準偏差 の正規分布の確率密度は
です。1 次元では に約 68%、 に約 95%、 に約 99.7% が入ります。2 次元の的の上では、半径 の円の内側に入る割合は で、1σ で約 39%、2σ で約 86%、3σ で約 99% です。
ボックス=ミュラー法:2 次元の正規分布は、中心からの距離と角度に分けると扱いやすくなります。角度は一様、距離の 2 乗は指数分布になるので、逆 CDF 法で
とすれば、 は独立な標準正規分布(平均 0、分散 1)に従います。 で好きな平均と広がりにします。
一様乱数の和:一様乱数を何個か足すと、中心極限定理により、和はつりがね形に近づきます。3 個でもかなり近く、12 個足して 6 を引く方法は昔からの手軽な近似です。ただし、足した個数で決まる範囲の外には決して出ません。
実装のポイント
- 2 つとも使う:ボックス=ミュラー法は一度に 2 つの値を作ります。1 つしか要らないときは、もう 1 つを次回用に取っておくと無駄がありません。
- 範囲を切る:まれに非常に大きな値が出ます。ダメージなどでは で打ち切る(範囲外なら引き直す)と、極端な結果を防げます。
- 3 次元の方向:正規乱数を 3 つ並べて正規化すると、球面上で一様な方向になります。
- GPU では:
logやcosが気になる場合は、一様乱数 3〜4 個の和で十分なことが多いです。
つまずきやすい点
u1 = 0で無限大:乱数が 0 を返すと で無限大になります。0 を避けるか、 を使います。- 分散と標準偏差の取り違え: は標準偏差です。分散 を渡すと、ばらつきがまったく違う大きさになります。
- 半径だけ正規分布にする:2 次元の散らばりを作るのに、半径を正規分布、角度を一様にすると、中心に点が集まりすぎます(半径 0 の付近の面積は小さいため)。2 つの軸をそれぞれ正規分布にします。
デモで試すこと
- 的に弾が当たり続けます。「正規分布」では中心に多く集まり、外へ行くほどまれになります。左下で、1σ・2σ・3σ の円の内側に入った割合が、正規分布の値(39% / 86% / 99%)に近づくことを確かめてください。
- 右下のヒストグラムは横方向のずれで、点線のつりがね形と重なります。
- 「一様乱数 3 個の和」も見た目はほとんど同じですが、3σ の円より外には決して当たりません。
- 「一様(四角)」と「一様(円盤)」は、同じ大きさのばらつきでも中心への集まりがなく、狙っている感じがしません。「ばらつきの大きさ σ」を変えると、円の大きさも一緒に変わります。