我试图生成存储的随机数,我需要返回字符串值。
这是我的方法:
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
。
同样的问题也出现在长值上。
计算有符号随机整数绝对值的最佳方法是什么?
答案 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。