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



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

     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,如果你想要更"安全"的随机性,你可以使用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;
 }

这取决于你如何调用这个方法。如果参数彼此接近(例如min为500,max为525),则输出将都在非常接近的范围内。如果参数相差很大(例如min为0,max为1000),则输出将有很大差异。

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

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

您的问题是每次调用都创建一个新的Random对象。为每个程序创建一个且仅一个Random实例,然后根据需要频繁地从它轮询。把它想象成一口取水的井——你不是每次需要喝水的时候都挖一口新井。默认初始化是从时钟中获取的,历史上是毫秒级的,在现代机器上,您可以用相同的初始化实例化多个实例,因此将产生相同的值。

使用时间将NOT通常给出随机结果,并且加密质量的随机性是多余的,除非您实际上正在进行加密。

最新更新