gamma method
Generates a random value from a gamma distribution.
Implementation
double gamma(double shape, [double scale = 1.0]) {
if (shape < 1) {
return gamma(shape + 1, scale) *
math.pow(_random.nextDouble(), 1 / shape);
}
final d = shape - 1 / 3;
final c = 1 / math.sqrt(9 * d);
while (true) {
double x, v;
do {
x = normal(0, 1);
v = 1 + c * x;
} while (v <= 0);
v = v * v * v;
final u = _random.nextDouble();
if (u < 1 - 0.0331 * (x * x) * (x * x)) {
return d * v * scale;
}
if (math.log(u) < 0.5 * x * x + d * (1 - v + math.log(v))) {
return d * v * scale;
}
}
}