我编写了一个简单的自动单击脚本,它运行良好,因为每次我认为都应该单击它。我想知道的一件事是,它被延迟了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) + 2500
与rand.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。