关于统一功能的实现代码

时间:2019-04-02 09:04:56

标签: java random long-integer uniform

我正在检查StdRandom's uniform的源代码

并对其实现的一部分感到困惑。

源代码如下:

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

所以我的问题是关于“ //拒绝过多代表的候选人”部分

这里(u + m-(r = u%n)<0L)的含义是什么? 我只能想到一种情况,当该表达式为真时,即(u + m)太大而溢出而变为负数时。 但是为什么呢?还是一开始我就错了?

0 个答案:

没有答案