function randomPoisson(lambda) {
var Exp = d3r.randomExponential(1);
return function() {
var acc = 0, l = lambda;
while (l > 16) {
var n = Math.floor(0.875 * l),
t = randomGamma(n, 1)();
if (t > l) {
return acc + randomBinomial(n - 1, l / t)();
}
acc += n;
l -= t;
}
for (var s = Exp(), k = 0; s <= l; ++k) s += Exp();
return acc + k;
};
}