随机数生成器给出奇怪的结果
Random number generator gives weird results
我有这个 class 首先存储鼠标光标的当前坐标,然后创建两个随机整数 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 到 right/left 和 top/bottom 它会在屏幕上随机移动,不喜欢某些特定的 position/corner .我总结了所有的水平移动,它给出了一个很大的负数(-4000+ 或 -5000+),表明光标确实倾向于移动到左边界。
nextInt(20)
将在 0
和 19
之间产生一个均匀分布的值。因此 nextInt(20) - 10
将产生一个介于 -10
和 9
之间的值。如您所见,这种分布的均值是 -0.5
。执行 N
此类随机选择的平均值为 -0.5N
。换句话说,随着时间的推移,您会看到总和向负数漂移,并且由于您对 X 和 Y 坐标使用相同的随机函数,因此该点将向左上角漂移。
您应该使用 nextInt(21) - 10
,它会在 -10
和 10
之间产生一个均匀分布的值,并得到您期望的结果。
我有这个 class 首先存储鼠标光标的当前坐标,然后创建两个随机整数 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 到 right/left 和 top/bottom 它会在屏幕上随机移动,不喜欢某些特定的 position/corner .我总结了所有的水平移动,它给出了一个很大的负数(-4000+ 或 -5000+),表明光标确实倾向于移动到左边界。
nextInt(20)
将在 0
和 19
之间产生一个均匀分布的值。因此 nextInt(20) - 10
将产生一个介于 -10
和 9
之间的值。如您所见,这种分布的均值是 -0.5
。执行 N
此类随机选择的平均值为 -0.5N
。换句话说,随着时间的推移,您会看到总和向负数漂移,并且由于您对 X 和 Y 坐标使用相同的随机函数,因此该点将向左上角漂移。
您应该使用 nextInt(21) - 10
,它会在 -10
和 10
之间产生一个均匀分布的值,并得到您期望的结果。