gamma method

double gamma(
  1. double shape, [
  2. double scale = 1.0
])

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