Java:随机数生成器中的过度代表候选人?

Java:随机数生成器中的过度代表候选人?,java,random,Java,Random,下面是在“Java算法和客户端-算法,第四版”的StdRandom类中生成长类型随机数的方法 公共静态长制服(长n){ 如果(n>>1; 而(u+m-(r=u%n)>>1; } 返回r; } 有人能解释一下(u+m-(r=u%n)

下面是在“Java算法和客户端-算法,第四版”的StdRandom类中生成长类型随机数的方法

公共静态长制服(长n){
如果(n>>1;
而(u+m-(r=u%n)<0L){
u=random.nextLong()>>>1;
}
返回r;
}

有人能解释一下(u+m-(r=u%n)<0L)部分在做什么吗?我不明白“过度代表候选人”是什么意思.

对不起,伙计们,我现在可以理解它的意思了。它可以防止位于长度n的最大不完整间隔处的随机数。

我只能假设它与javadoc中的这段引用有关,
nextLong()
,“因为类random使用的种子只有48位,所以此算法不会返回所有可能的长值。”但这段代码似乎与48位无关。也许有一些隐藏的数学技巧?
    public static long uniform(long n) {
    if (n <= 0L) throw new IllegalArgumentException("argument must be positive: " + n);

    // https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#longs-long-long-long-
    long r = random.nextLong();
    long m = n - 1;

    // power of two
    if ((n & m) == 0L) {
        return r & m;
    }

    // reject over-represented candidates
    long u = r >>> 1;
    while (u + m - (r = u % n) < 0L) {
        u = random.nextLong() >>> 1;
    }
    return r;
}