О коде реализации для единой функции - PullRequest
0 голосов
/ 02 апреля 2019

Я проверял исходный код Униформа StdRandom

И был озадачен частью его реализации.

Исходный код приведен ниже:

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) становится слишком большим и переполняется, чтобы быть отрицательным числом.Но почему тогда?Или я не прав с самого начала? </p>

...