我需要在两个整数之间得到一个随机数。我正在使用此功能来获取它:
public int randInt(int min, int max) {
Random rand = new Random();
int randomNum = rand.nextInt((max - min) + 1) + min;
return randomNum;
}
问题在于,有时功能不正常,因为它给了我很少差异的数字链,例如,我用min 0和max 1000调用函数,有时我得到链中的这些值:500,500,502,500,500,500,520,530,503,500,500,501等......
有时功能正常,我得到的差异很大,例如1,20,500,200,444,850,664等......
所以...我需要一个总是返回真实随机数的函数,有时候不需要......
有更好的方法来实现这一目标吗?具有随机的最小值和最大值?
感谢
答案 0 :(得分:6)
不要在每次调用时重新初始化Random
,如果您想要更“安全”的随机性,可以使用SecureRandom
。
private static Random rand = new SecureRandom();
public int randInt(int min, int max) {
// Random rand = new Random();
int randomNum = rand.nextInt((max - min) + 1) + min;
return randomNum;
}
答案 1 :(得分:1)
这取决于你如何调用该方法。如果参数彼此接近(假设min
为500且max
为525,则输出将在非常接近的范围内。如果参数相距很远(例如min
}为0且max
为1000,您的输出会有很大变化。
该方法本身可以正常工作。
答案 2 :(得分:1)
您可以使用当前时间并乘以让我们说最后一位数字。这会让你更随意。
我没有任何代码可用,但听起来像getCurrentime()
答案 3 :(得分:1)
您的问题是每次调用都会创建一个新的Random
对象。每个程序只创建一个Random
个实例,然后根据需要经常从中进行轮询。可以认为它与水井类似 - 每次需要饮用时都不会挖新井。默认初始化取自时钟,历史上是毫秒级,在现代机器上,您可以使用相同的初始化实例化多个实例,从而产生相同的值。
使用时间 NOT 一般会给出随机结果,而加密质量随机性是过度的,除非您实际上正在进行加密。