我有这个类,它首先存储鼠标光标的当前坐标,然后创建两个随机整数 x 和 y 都在 -10 和 10 之间,然后水平和垂直移动鼠标光标等于这些生成的数字的量分别。
public class Test {
private static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
private static int width= (int) screenSize.getWidth();
private static int height=(int) screenSize.getHeight();
private static int currentX=(int) MouseInfo.getPointerInfo().getLocation().getX();
private static int currentY =(int) MouseInfo.getPointerInfo().getLocation().getY();
public static void main(String[] args) throws java.awt.AWTException {
Robot robot=new Robot();
Random random = new Random();
int xMove;
int yMove;
int[] resultArray=new int[10000];
for (int i=0; i<10000; i++) {
refreshCoords();
xMove=random.nextInt(20) - 10; // - 10 to 10
yMove=random.nextInt(20) - 10;
robot.mouseMove(currentX + xMove, currentY + yMove);
resultArray[i]=xMove;
}
System.out.println(sumArray(resultArray)); //returns - 4000/-5000
}
private static void refreshCoords() {
currentX=(int) MouseInfo.getPointerInfo().getLocation().getX();
currentY=(int) MouseInfo.getPointerInfo().getLocation().getY();
}
private static int sumArray(int[] resultArray) {
int result=0;
for (int i=0; i<resultArray.length; i++) {
result+=resultArray[i];
}
return result;
}
}
问题是,虽然我预计鼠标光标大部分会停留在同一位置或逐渐在屏幕上移动而不是太远,但无论鼠标光标最初位于何处,它都倾向于移动到左上角。我不明白这里出了什么问题,为什么会发生这种情况?我认为,如果每次循环鼠标光标移动 - 10 到 10 到右/左和顶部/底部,它会在屏幕上随机徘徊,而不是喜欢某些特定的位置/角落。我总结了所有水平移动,它给出了一个很大的负数(-4000+或-5000+),表明光标确实倾向于移动到左边界。
最佳答案
nextInt(20)
将生成 0
和 19
之间均匀分布的值。因此 nextInt(20) - 10
将产生 -10
和 9
之间的值。正如您所看到的,这种分布的平均值是-0.5
。执行 N
这样的随机选择将得到 -0.5N
的平均值。换句话说,随着时间的推移,您会看到总和向负值漂移,并且由于您对 X 和 Y 坐标使用相同的随机函数,因此该点将向左上角漂移。
您应该使用 nextInt(21) - 10
,它将生成 -10
和 10
之间均匀分布的值,并获得您期望的结果。
关于java - 随机数生成器给出奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46130544/