我编写了一个简单的自动单击脚本,它运行良好,因为每次我认为都应该单击它。我想知道的一件事是,它被延迟了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随机延迟了几毫秒吗?我很难弄清楚这一点。

最佳答案

由于nextInt上限是互斥的,因此延迟值为2500到4999之间的随机数。从Java SE Specification:

公共int nextInt(整数绑定)
返回一个伪随机数,它从此随机数生成器的序列中提取,在0(含)和指定值(不含)之间均匀分布的int值。 nextInt的一般约定是伪随机生成并返回指定范围内的一个int值。所有绑定的可能的int值均以(近似)相等的概率产生。
rand.nextInt(5000-2500) + 2500rand.nextInt(2500) + 2500相同(我认为这是一种更干净的编写方式)。
同样, int 值也将转换为 long 而不会丢失信息(long的范围比int宽,因此没有问题)。从Java SE Specification:

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

最后,关于随机不是真正的随机,您是对的,它是伪随机的(这意味着所有可能的数字不是完全相等的概率,而是近似相等的概率)。我不确定您将这段代码用于什么,但是我认为这足够满足您的需求。
您可以查看this post,了解给定范围内java中的随机值。
以及this post关于随机随机性。
PD:您的代码(imho)的一个很好的改进是将rand变量private static代替了local。

10-05 23:12
查看更多