困难在于max减去min时可能会溢出,但用for循环一一计算也很耗时。
public static long random(long min, long max, int step) {
if (step <= 0) {
throw new IllegalArgumentException("step must > 0");
}
if (max < min) {
throw new IllegalArgumentException("invalid range! min must <= max");
}
long range = (max - min) / step + 1;
long randomIndex = ThreadLocalRandom.current().nextLong(range);
return min + randomIndex * step;
}
我猜你指的是min<0 and hence max - min is greater than Long.MAX_VALUE?
的情况然后您可以检查确切的情况。
if( min < 0 && max - Long.MAX_VALUE > min )
在这种情况下,您将必须生成两个随机数,因为您的范围实际上超出了 Long.MAX_VALUE。
你应该能够将它吐成两半,并随机选择一个双倍来选择上半部分或下半部分。