获得两个值范围内的随机长



我写了一个简单的自动点击脚本,它运行得很好,就像我认为它应该每次点击一样。不过,我想知道的一件事是,它应该以2500毫秒到5000毫秒之间的随机间隔延迟。我只是不是100%它在做那件事?

所有代码都在这里:

public static void click(int desiredAmount)
    {
        int counter = 0;
        Random rand = new Random();
        while (counter < desiredAmount)
        {
            try {
                Thread.sleep(rand.nextInt(5000-2500) + 2500);
            } catch (InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
            robot.mousePress(MouseEvent.BUTTON1_DOWN_MASK);
            robot.mouseRelease(MouseEvent.BUTTON1_DOWN_MASK);
            ++counter;
        }
    }

只是一个简单的点击方法,我对这行代码Thread.sleep(rand.nextInt(5000-2500) + 2500); 感到担忧

我使用nextInt(int x)方法来获得两个值之间的随机INT,但我使用的Thread.sleep();方法将long作为参数。这是否意味着它将被截断?不是2500毫秒,而是2秒?或者3秒或4秒,而不是2646毫秒或3876毫秒等?

它真的会将每次点击从2500-5000随机延迟一毫秒吗?我很难弄清楚。

延迟值将是一个从2500到4999的随机数,因为nextInt的上限是独占的。来自Java SE规范:

public int nextInt(int bound)

返回一个伪随机、均匀分布的int值,该值介于0(包括0)和指定值(不包括0)之间,取自此随机数生成器的序列。nextInt的一般约定是伪随机生成并返回指定范围内的一个int值。所有有界的可能的int值都是以(近似)相等的概率产生的。

rand.nextInt(5000-2500) + 2500rand.nextInt(2500) + 2500相同(在我看来,这是一种更干净的编写方式)。

此外,int值在不丢失信息的情况下转换为long(long的范围比int宽,因此没有问题)。来自Java SE规范:

从int类型到long类型的转换需要32位整数值到64位长表示的运行时符号扩展。没有丢失任何信息。

最后,关于随机不是真正的随机,你是对的,它是伪随机的(这意味着所有可能的数字的概率不是完全相等的,而是近似相等的)。我不完全确定你使用这个代码是为了什么,但我认为这将是";足够随机";满足您的需求。

您可以看看这篇关于java中给定范围内的随机值的文章。这篇关于随机性的文章。

PD:代码(imho)的一个很好的改进是使rand变量private static而不是局部变量。

最新更新