/**
* @memberOf Util
* @class Random
* @classdesc Random 乱数取得
* <p>
* ある事象の単位時間あたりの発生回数がポアソン分布, その発生間隔が指数分布に従う<br>
* M/M/1モデルは、到着がポアソン過程となり、(したがって到着間隔は指数分布に従う)、サービス時間が指数分布に従う
* <p>
* 参考 {@link http://www.ishikawa-lab.com/montecarlo/4shou.html}
*
* @param {Number}
* [average=0.5] 平均値
* @example var r = HJN_util.Random(10), val = r.exponential();
*/
export default (function() { // #56
/** @constructor */
function Random(average){
if(!(this instanceof Random)) return new Random(average);
this._average = average || 0.5;
}
/** @private */
// public
/**
* 一様分布となる乱数を返却する
*
* @memberof Util.Random
* @param {Number}
* [average=this._average] 平均値<br>
* @return {Number} 乱数
*/
Random.prototype.uniform = function(average) {
average = average || this._average;
return 2.0 * average * Math.random();
};
/**
* 指数分布となる乱数を返却する(lambda = 1/average)
*
* @memberof Util.Random
* @param {Number}
* [average=this._average] 平均値=1/λ、分散=1/(λ^2)<br>
* @return {Number} 乱数
*/
Random.prototype.exponential = function(average) {
average = average || this._average;
return (-1.0 * average) * Math.log(1.0 - Math.random());
};
/**
* ポアソン分布となる乱数を返却する(lambda = average)
*
* @memberof Util.Random
* @param {Number}
* [average=this._average] 平均値=分散=λ<br>
* @return {Number} 乱数
*/
Random.prototype.poisson = function(average) {
var lambda = average || this._average;
var xp = Math.random();
var k = 0;
while (xp >= Math.exp(-lambda)) {
xp = xp * Math.random();
k = k + 1;
}
return (k);
};
/* new */
return Random;
}());