rangeUniform static method

int rangeUniform(
  1. int limit
)

Return a random integer uniformly distributed in the range [0, limit) with no division, using rejection sampling. The mask m is used to minimize rejections, which will be at worst 50%.

Implementation

static int rangeUniform(int limit) {
  assert(limit > 0);
  int m = limit - 1;
  for (int i in [1, 2, 4, 8, 16]) {
    m |= m >> i;
  }

  while (true) {
    int r = next32() & m;
    if (r < limit) {
      return r;
    }
  }
}