Изменение координат с условием

У меня есть сетка 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;
    }
}

Но мне кажется, что это как-то не так. Может быть, есть лучшее решение?

Я думаю, что ваш вопрос больше подходит для Code Review Stack Exchange.

Abra 17.08.2024 10:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто чтобы вместо этого удалить повторяющиеся блоки кода цикла 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, но я с этим справлюсь :) Большое спасибо, чувак.

user26600642 17.08.2024 23:07

Мне было приятно ;)

DevilsHnd - 退した 18.08.2024 01:59

Другие вопросы по теме