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

Java Random nextInt()工作不正常,获取随机数的更好方法?,java,android,random,Java,Android,Random,我需要得到两个整数之间的一个随机数。我正在使用此函数获取它: public int randInt(int min, int max) { Random rand = new Random(); int randomNum = rand.nextInt((max - min) + 1) + min; return randomNum; } 问题是,有时函数工作不正常,因为它给了我一系列差异很小的数字,例如,我用最小值0和最大值

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

     public int randInt(int min, int max) {
        Random rand = new Random();
        int randomNum = rand.nextInt((max - min) + 1) + min;
        return randomNum;
     }
问题是,有时函数工作不正常,因为它给了我一系列差异很小的数字,例如,我用最小值0和最大值1000调用函数,有时我在一个链中得到这些值:500、500、502、500、500、500、520、530、503、500、500、501等等

有时函数工作正常,我得到的值差别很大,例如,1、20、500、200、444、850、664等等

所以。。。我需要一个函数,它可以一直返回真实的随机数,而不是有时

有更好的方法来实现这一点吗?随机变量的最小值和最大值


谢谢

不要在每次调用时重新初始化
Random
,如果您想要更“安全”的随机性,可以使用

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;
 }

这取决于调用方法的方式。如果参数彼此接近(例如
min
为500,
max
为525),则您的输出都将在一个非常接近的范围内。如果参数相距很远(例如
min
为0,
max
为1000),则您的输出将变化很大


该方法本身工作正常。

您可以使用当前时间并与最后一位数字相乘。这将给您带来更多的随机性


我没有任何可用的代码,但听起来像GetCurrentTime()

您的问题是在每次调用时创建一个新的
Random
对象。为每个程序创建一个且仅一个
Random
实例,然后根据需要从中进行轮询。将其视为类似于一口水井——您不需要每次需要喝水时都挖一口新井。默认初始化是从时钟开始的,他的在毫秒级上,在现代机器上,您可以使用相同的初始化实例化多个实例,从而产生相同的值


一般来说,使用时间不会给出随机结果,而加密质量的随机性是多余的,除非你真的在做加密。

值得注意的是,从统计角度来看,secureRandom不会“更随机”(这不是问题所在),只是很难逆向工程它不是“真正”的方式random+1很好。我没有意识到问题在于在每次调用中重新实例化random类。现在它确实有意义。有了这些类型的结果,看起来不像你在传递你认为传递的东西(作为最小-最大值)。检查你的参数是否真的是0和1000。