longの乱数を指定範囲で得る方法、intと同じでよかった

結局、ちょっと勘違いがあって、nextInt(int)と同じことをやればよかったことがわかりました。

long nextLong(long n){
  long bits, value;
  do{
    bits = r.nextLong();
    if(bits < 0) bits -= Long.MIN_VALUE;
    val = bits % n;
  } while (bits - val + (n - 1);
  return val;
}


ところでこの、bit-val+(n-1)っていう判定、すごく賢いんですけど、誰が考えたんでしょう?
やっぱArt of Computer Programmingに載ってたりして、クヌース先生が考えたってことなんでしょうか?