PerlinNoise

class PerlinNoise {
  constructor (random = Math.random) {
    this.random   = random;
    this.gradient = new Map;
  }

  randomGradient (x) {
    if (! this.gradient.has (x))
      this.gradient.set (x, this.random () * 2 -1);
    return this.gradient.get (x);
  }

  noise (x) {
    let
      x0 = x |0, x1 = x0 + 1,
      r0 = x - x0, r1 = r0 - 1,
      u = r0 * this.randomGradient (x0),
      v = r1 * this.randomGradient (x1),
      sx = r0 * r0 * (3 - 2 * r0);

    return 2 * (u + sx * (v - u));
  }
}