ゲームのダメージ値とかであるあれです。
ダメージ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に書きなおさせてもらいました。