91 lines
2.3 KiB
JavaScript
91 lines
2.3 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _owLite = require('ow-lite');
|
|
|
|
var _owLite2 = _interopRequireDefault(_owLite);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var logFactorialTable = [0.0, 0.0, 0.69314718055994529, 1.7917594692280550, 3.1780538303479458, 4.7874917427820458, 6.5792512120101012, 8.5251613610654147, 10.604602902745251, 12.801827480081469];
|
|
|
|
var logFactorial = function logFactorial(k) {
|
|
return logFactorialTable[k];
|
|
};
|
|
|
|
var logSqrt2PI = 0.91893853320467267;
|
|
|
|
exports.default = function (random) {
|
|
var lambda = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
|
|
(0, _owLite2.default)(lambda, _owLite2.default.number.positive);
|
|
|
|
if (lambda < 10) {
|
|
// inversion method
|
|
var expMean = Math.exp(-lambda);
|
|
|
|
return function () {
|
|
var p = expMean;
|
|
var x = 0;
|
|
var u = random.next();
|
|
|
|
while (u > p) {
|
|
u = u - p;
|
|
p = lambda * p / ++x;
|
|
}
|
|
|
|
return x;
|
|
};
|
|
} else {
|
|
// generative method
|
|
var smu = Math.sqrt(lambda);
|
|
var b = 0.931 + 2.53 * smu;
|
|
var a = -0.059 + 0.02483 * b;
|
|
var invAlpha = 1.1239 + 1.1328 / (b - 3.4);
|
|
var vR = 0.9277 - 3.6224 / (b - 2);
|
|
|
|
return function () {
|
|
while (true) {
|
|
var u = void 0;
|
|
var v = random.next();
|
|
|
|
if (v <= 0.86 * vR) {
|
|
u = v / vR - 0.43;
|
|
return Math.floor((2 * a / (0.5 - Math.abs(u)) + b) * u + lambda + 0.445);
|
|
}
|
|
|
|
if (v >= vR) {
|
|
u = random.next() - 0.5;
|
|
} else {
|
|
u = v / vR - 0.93;
|
|
u = (u < 0 ? -0.5 : 0.5) - u;
|
|
v = random.next() * vR;
|
|
}
|
|
|
|
var us = 0.5 - Math.abs(u);
|
|
if (us < 0.013 && v > us) {
|
|
continue;
|
|
}
|
|
|
|
var k = Math.floor((2 * a / us + b) * u + lambda + 0.445) | 0;
|
|
v = v * invAlpha / (a / (us * us) + b);
|
|
|
|
if (k >= 10) {
|
|
var t = (k + 0.5) * Math.log(lambda / k) - lambda - logSqrt2PI + k - (1 / 12.0 - (1 / 360.0 - 1 / (1260.0 * k * k)) / (k * k)) / k;
|
|
|
|
if (Math.log(v * smu) <= t) {
|
|
return k;
|
|
}
|
|
} else if (k >= 0) {
|
|
if (Math.log(v) <= k * Math.log(lambda) - lambda - logFactorial(k)) {
|
|
return k;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
};
|
|
//# sourceMappingURL=poisson.js.map
|