ゲームで、正規分布に従う乱数が欲しい。
一様乱数ではなく、自然なランダム性が必要だ。
そんな場面で使えるのが、ボックスミュラー法です。
ボックスミュラー法は、一様乱数から正規分布の乱数を生成する数学的手法です。
これを使うことで、自然なランダム性を実現できます。
この記事では、ボックスミュラー法の仕組みとして、正規分布の乱数を生成する数学的手法を見ていきましょう。
- ボックスミュラー法の仕組みが分からない…
- 正規分布の乱数を生成したい。
- 自然なランダム性を実現したい。
✨ この記事でわかること
- ボックスミュラー法とは何かの基本概念
- 正規分布の乱数生成の仕組み
- 一様乱数から正規分布への変換
- Unityでの実装方法
- 初心者でも理解できるボックスミュラー法の考え方
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます
ボックスミュラー法とは何か(ゲーム制作目線)

ボックスミュラー法は、一様乱数から正規分布の乱数を生成する数学的手法です。
正規分布は、平均値を中心に、左右対称の山型の分布を持つ確率分布です。
ボックスミュラー法を使うことで、一様乱数から正規分布の乱数を効率的に生成できます。
ゲーム開発では、ドロップ率の調整、AIの挙動、ランダムな数値生成など、様々な場面で使われます。
正規分布に従う乱数を使うことで、一様乱数よりも自然なランダム性を実現できます。
ゲームでの具体的な使い道

ボックスミュラー法が、ゲームでどう使われているか確認してみましょう。
ドロップ率の調整
正規分布に従う乱数を使って、ドロップ率を調整します。
平均値付近に多くの値が集中するため、より自然なドロップ率になります。
AIの挙動
正規分布に従う乱数を使って、AIの挙動にランダム性を持たせます。
平均的な挙動を中心に、自然なバリエーションを実現できます。
ランダムな数値生成
正規分布に従う乱数を使って、様々な数値を生成します。
例えば、ダメージ値や、移動速度などに使われます。
自然なランダム性
一様乱数よりも、正規分布に従う乱数の方が自然なランダム性を実現できます。
現実世界の多くの現象が、正規分布に従うためです。
- ドロップ率の調整(自然な確率分布)
- AIの挙動(自然なバリエーション)
- ランダムな数値生成(ダメージ値、移動速度など)
- 自然なランダム性の実現
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
考え方・仕組みを図解イメージで説明

ボックスミュラー法は、一様乱数から正規分布の乱数を生成します。
基本的な仕組み
2つの一様乱数を使って、2つの正規分布の乱数を生成します。
数学的には、極座標変換と指数関数を使った計算で実現できます。
正規分布の特徴
正規分布は、平均値を中心に、左右対称の山型の分布を持ちます。
平均値付近に多くの値が集中し、離れるほど値が少なくなります。
一様乱数との違い
一様乱数は、すべての値が同じ確率で出現します。
正規分布に従う乱数は、平均値付近に多くの値が集中します。
変換の計算
2つの一様乱数(u1、u2)から、2つの正規分布の乱数(z1、z2)を生成します。
計算式は、極座標変換と指数関数を使った複雑な式になります。
- ボックスミュラー法は、一様乱数から正規分布の乱数を生成する
- 2つの一様乱数から、2つの正規分布の乱数を生成できる
- 正規分布は、平均値を中心に左右対称の山型の分布を持つ
- 平均値付近に多くの値が集中するため、自然なランダム性を実現できる
Unityで実装する際の注意点(代表例)

Unityでボックスミュラー法を実装する場合の注意点を見ていきましょう。
基本的な実装
ボックスミュラー法を使って、正規分布の乱数を生成します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public class BoxMullerMethod { private static float spare; private static bool hasSpare = false; public static float NextGaussian(float mean, float standardDeviation) { if (hasSpare) { hasSpare = false; return spare * standardDeviation + mean; } hasSpare = true; float u, v, s; do { u = Random.Range(-1f, 1f); v = Random.Range(-1f, 1f); s = u * u + v * v; } while (s >= 1f || s == 0f); s = Mathf.Sqrt(-2f * Mathf.Log(s) / s); spare = v * s; return mean + standardDeviation * u * s; } } |
使用例
ボックスミュラー法を使って、正規分布の乱数を生成する例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class RandomValueGenerator : MonoBehaviour { public float mean = 10f; // 平均値 public float deviation = 2f; // 標準偏差 void GenerateRandomValue() { // 正規分布の乱数を生成 float randomValue = BoxMullerMethod.NextGaussian(mean, deviation); Debug.Log("生成された値: " + randomValue); } } |
ドロップ率への応用
正規分布に従う乱数を使って、ドロップ率を調整します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class DropRateController : MonoBehaviour { public float baseDropRate = 10f; public float deviation = 2f; public bool ShouldDrop() { // 正規分布の乱数を生成 float dropRate = BoxMullerMethod.NextGaussian(baseDropRate, deviation); // 確率に変換(0〜100の範囲に調整) dropRate = Mathf.Clamp(dropRate, 0f, 100f); return Random.Range(0f, 100f) < dropRate; } } |
実装のコツ
ボックスミュラー法は、一度の計算で2つの正規分布の乱数を生成できるため、効率的です。
1つは即座に返し、もう1つは次回のために保存します。
平均値と標準偏差を適切に設定することが大切です。

まとめ

この記事では、ボックスミュラー法の仕組みについて見てきました。
重要なポイントをおさらいします。
- ボックスミュラー法は、一様乱数から正規分布の乱数を生成する
- 2つの一様乱数から、2つの正規分布の乱数を生成できる
- 正規分布は、平均値を中心に左右対称の山型の分布を持つ
- 平均値付近に多くの値が集中するため、自然なランダム性を実現できる
- ドロップ率の調整やAIの挙動など、様々な場面で使える
ボックスミュラー法は、ゲーム開発で非常に有用な技術です。
一様乱数から正規分布の乱数を生成するため、自然なランダム性を実現できます。
平均値付近に多くの値が集中するため、一様乱数よりも自然な結果が得られます。
実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、ボックスミュラー法を含む確率と乱数を、実際のゲーム実装とともに体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント