29 lines
716 B
JavaScript
29 lines
716 B
JavaScript
|
|
import defaultSource from "./defaultSource.js";
|
||
|
|
|
||
|
|
export default (function sourceRandomNormal(source) {
|
||
|
|
function randomNormal(mu, sigma) {
|
||
|
|
var x, r;
|
||
|
|
mu = mu == null ? 0 : +mu;
|
||
|
|
sigma = sigma == null ? 1 : +sigma;
|
||
|
|
return function() {
|
||
|
|
var y;
|
||
|
|
|
||
|
|
// If available, use the second previously-generated uniform random.
|
||
|
|
if (x != null) y = x, x = null;
|
||
|
|
|
||
|
|
// Otherwise, generate a new x and y.
|
||
|
|
else do {
|
||
|
|
x = source() * 2 - 1;
|
||
|
|
y = source() * 2 - 1;
|
||
|
|
r = x * x + y * y;
|
||
|
|
} while (!r || r > 1);
|
||
|
|
|
||
|
|
return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
randomNormal.source = sourceRandomNormal;
|
||
|
|
|
||
|
|
return randomNormal;
|
||
|
|
})(defaultSource);
|