我有 500x500 网格和该网格上的随机坐标。我正在尝试获取新的随机坐标,但它们不应该与以前的坐标太接近。我想出了这个:在无限循环中,我为变量分配一个新的随机值,如果该值满足条件(它在一定数量上更大或更小(可能会改变)),那么我将打破循环.
int oldX = (int) (Math.random() * 500);
int oldY = (int) (Math.random() * 500);
int newX;
int newY;
int minDistance = 10;
while (true) {
newX = (int) (Math.random() * 500);
if (newX <= (oldX - minDistance) | newX >= (oldX + minDistance)) {
break;
}
}
while (true) {
newY = (int) (Math.random() * 500);
if (newY <= (oldY - minDistance) | newY >= (oldY + minDistance)) {
break;
}
}
但我感觉有些不对劲。也许有更好的解决方案?
只是为了将重复的
while
循环代码块删除到方法调用中,并假设 500 x 500
网格从索引 0 开始,到索引 499 结束,这将使当前的随机公式正确 为那些值是可以达到的。如果要包含 500,则当前的随机公式是不正确,因为该值无法达到。您必须将 500
更改为 501
才能使 500
包含在内。
这还假设
newX
和 newY
最终将分别变成 oldX
和 oldY
。
int x = 0, y = 0;
int minDistance = 10;
x = getRandom(x, minDistance);
y = getRandom(y, minDistance);
System.out.println(String.format("%-3d - %-3d", x, y)); // Optional
getRandom()
方法:
public static int getRandom(int currentXorY, int minDistance) {
int rnd = currentXorY;
while (rnd >= (currentXorY - minDistance) && rnd <= (currentXorY + minDistance)) {
rnd = (int) (Math.random() * 500);
}
return rnd;
}