如何一步一步生成一个介于 min 和 max 之间的值,但又避免算术溢出?

问题描述 投票:0回答:1

困难在于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;
    }
java
1个回答
0
投票

我猜你指的是min<0 and hence max - min is greater than Long.MAX_VALUE?

的情况

然后您可以检查确切的情况。

if( min < 0 && max - Long.MAX_VALUE > min )

在这种情况下,您将必须生成两个随机数,因为您的范围实际上超出了 Long.MAX_VALUE。

你应该能够将它吐成两半,并随机选择一个双倍来选择上半部分或下半部分。

© www.soinside.com 2019 - 2024. All rights reserved.