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); | |