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

时间:2016-01-11 00:02:31

标签: java sleep

我写了一个简单的自动点击脚本,它运行正常,因为每次我认为应该点击它。有一件事我想知道它,它意味着在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的随机毫秒?我很难搞清楚这一点。

1 个答案:

答案 0 :(得分:3)

延迟值将是2500到4999之间的随机数,因为nextInt上限是独占的。来自Java SE Specification

  

public int nextInt(int bound)

     

返回从该随机数生成器序列中提取的伪随机,均匀分布的int值,介于0(包括)和指定值(不包括)之间。 nextInt的常规协定是伪随机生成并返回指定范围内的一个int值。所有绑定的可能int值都以(近似)相等的概率生成。

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

int 值也会转换为 long 而不会丢失信息(long的范围比int宽,所以没有问题)。来自Java SE Specification

  

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

最后关于随机不是真正的随机,你是对的伪随机(这意味着所有可能的数字没有完全相等的概率,但大致相等)。我不完全确定您使用此代码的是什么,但我认为这将是&#34;足够随机&#34;满足您的需求。

您可以查看this post有关给定范围内java中随机值的信息。 this post关于随机随机性。

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