У меня есть сетка 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;
}
Это намного лучше. Сетка от 0 до 499. Мне было интересно, как поместить условие в сам цикл вместо проверки if (стыдно), теперь я понимаю. Я не упоминал, что переменные oldX и newX должны какое-то время сосуществовать, прежде чем newX заменит oldX, но я с этим справлюсь :) Большое спасибо, чувак.
Мне было приятно ;)
Я думаю, что ваш вопрос больше подходит для Code Review Stack Exchange.