随机的nextInt()工作不正常,更好的方法来获取随机数?

时间:2014-07-13 19:07:28

标签: java android random

我需要在两个整数之间得到一个随机数。我正在使用此功能来获取它:

     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等......

所以...我需要一个总是返回真实随机数的函数,有时候不需要......

有更好的方法来实现这一目标吗?具有随机的最小值和最大值?

感谢

4 个答案:

答案 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 一般会给出随机结果,而加密质量随机性是过度的,除非您实际上正在进行加密。