Во-первых, вы запускаете генератор случайных чисел каждый раз, когда вводите метод, двигайтесь:
Random r = new Random();
к атрибуту класса.
Во-вторых, похоже, что если ваш метод вернется, он вернет только пустой вектор, потому что вы каждый раз создаете новый.
В-третьих, вы перечислите 8 возможных направлений, которые делают код более сложным, чем нужно, попробуйте переписать его, обрабатывая строки и столбцы по отдельности, например:
if (to.c == from.c && to.r == from.r) {
// reached destination
return;
}
if (to.c > from.c) {
// move right
} else if (to.c < from.c) {
// move left
} else {
// random step left/right
}
if (to.r > from.r) {
// move down
} else if (to.r < from.r) {
// move up
} else {
// random step up/down
}
// take next step
Редактировать : ваш алгоритм в его нынешнем виде может достичь местоположения to
, только если последний шаг является диагональным. Если ваш последний шаг горизонтальный, вы всегда отклоняетесь от вертикали и наоборот, поэтому вы будете парить вокруг конечного пункта до бесконечности, что приведет к переполнению стека.
Возможным решением было бы использовать nextInt (3), а не отклоняться от одной трети времени.