如何计算有符号随机整数的绝对值

时间:2014-05-02 19:50:29

标签: java findbugs

我试图生成存储的随机数,我需要返回字符串值。

这是我的方法:

public String generateRand() {
    java.util.Random rand = new java.util.Random(System.currentTimeMillis());
    String rnd = "" + Math.abs(rand.nextInt()) + "" +
       Math.abs(System.currentTimeMillis());
    return rnd;
}

Jenkins的Findbugs插件警告我有Bad attempt to compute absolute value of signed random integer

此代码生成随机有符号整数,然后计算该随机整数的绝对值。如果随机数生成器返回的数字是Integer.MIN_VALUE,那么结果也将是负数,因为Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE。 同样的问题也出现在长值上。

计算有符号随机整数绝对值的最佳方法是什么?

3 个答案:

答案 0 :(得分:10)

使用 rand.nextInt(Integer.MAX_VALUE); 代替 rand.nextInt(Integer.MAX_VALUE);

答案 1 :(得分:7)

考虑byte。它的值范围从-128到127.假设您的byte的值为-100,那么Math.abs(-100)将给出100.但是如果您的字节值是-128怎么办?您不能将128表示为byte,因为它可以表示的最大值为127.所以Math.abs()只返回否定参数,不变。

故事的寓意是Math.abs()可能会返回负值。

答案 2 :(得分:1)

听起来插件识别特定情况Math.abs(rand.nextInt())。所以写一些不同的东西。

插件知道那种情况并不总是有效:它知道rand.nextInt()有时可以返回Integer.MIN_VALUE,并且它知道无法计算Math.abs(Integer.MIN_VALUE) 。我会考虑编写自己的随机数函数,它不会返回Integer.MIN_VALUE。