Я проверял исходный код Униформа 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>