LoginSignup
27
25

More than 5 years have passed since last update.

正規分布(標準ガウス分布)のランダム関数 - ボックス=ミューラー法

Last updated at Posted at 2012-12-26

ゲームのダメージ値とかであるあれです。
ダメージ80だけど、ある程度運の要素で5前後させたい時などに使います。
正規分布で平均値と分散値を与えて、ランダムな値を取得します。

/**
 * 正規分布乱数関数 参考:http://d.hatena.ne.jp/iroiro123/20111210/1323515616
 * @param number m 平均μ
 * @param number s 分散σ^2
 * @return number ランダムに生成された値
 */
var normRand = function (m, s) {
    var a = 1 - Math.random();
    var b = 1 - Math.random();
    var c = Math.sqrt(-2 * Math.log(a));
    if(0.5 - Math.random() > 0) {
        return c * Math.sin(Math.PI * 2 * b) * s + m;
    }else{
        return c * Math.cos(Math.PI * 2 * b) * s + m;
    }
};

実際に以下のコードで実験してみると、

for (var i = 0; i < 100; i++) {
    console.log(normRand(80, 5));
};

81.39403776531488
77.30179861528501
75.13515899227075
76.47488194059684
83.91200749497585
76.45111222527056
71.65510396401942
75.89597123221556
81.3975834181407
78.35348180588761
73.83973290528844
82.64755277391454
...
のような数値が返ってきます。ダメージの場合はこれをMath.round()してください。
あと分散が大きいと負の値が返ることもあるので要注意。
参考にさせてもらったところがJavascript1.7だったので、1.5に書きなおさせてもらいました。

27
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
25