2014-11-26 2 views
0

Итак, я пытаюсь вычислить расстояние между двумя точками. Мне дано семя и количество симуляций. Мой код работает, но не работает? Случайный генератор не генерирует числа и не добавляет их в массив. Я сеяю случайный генератор с r и используя n для запуска моделирования.Формула расстояния со случайными целыми числами. Выход не производится

Редактирование: Программа застревает в цикле после ввода входа через консоль. Он застревает по строке X1[i] = rand.nextInt(1000);.

Примера ввод

2 --- т (число Парижа, чтобы быть испытано)

12087 400 --- R, N (R = число потомства переменного с, п = число раз пробег Rand)

7418 978 --- г, п (Второй г и п)

Пример выходных данных, например, вход --- (это из книги)

553,99 525.789

С этими числами мы используем случайный генератор для создания X1, X2, Y1, Y2. Эти числа будут использоваться для расчета расстояния.

import java.io.*; 
import java.util.*; 

public class Distance { 

    public static void main(String[] args) { 
     double distance = 0; // initiates all numbers needed and sets to 0) 
     int r[] = new int[10]; 
     int n[] = new int[10]; 
     int X1[] = new int[10]; // Array initiations 
     int X2[] = new int[10]; 
     int Y1[] = new int[10]; 
     int Y2[] = new int[10]; 

     Scanner q = new Scanner(System.in); 

     int t = q.nextInt(); // Scans in t (Number of lines to follow) 

     for (int i = 0; i < t; i++) { 
      r[i] = q.nextInt(); // Scans in r (Number of Random Objects) 
      n[i] = q.nextInt(); // Scans in n (Number of Simulations) 
     } 

     for (int i = 0; i < n[i]; i++) { 
      Random rand = new Random(r[i]); 
      X1[i] = rand.nextInt(n[i]); // fills index(s) i with Random number 
             // in X1 values 
      X2[i] = rand.nextInt(n[i]); // fills index(s) i with Random number 
             // in X2 values 
      Y1[i] = rand.nextInt(n[i]); // fills index(s) i with Random number 
             // in Y1 values 
      Y2[i] = rand.nextInt(n[i]); // fills index(s) i with Random number 
             // in Y2 values 

      distance = Math.sqrt(Math.pow((X2[i] - X1[i]), 2) 
        + Math.pow((Y2[i] - Y1[i]), 2)); 
     } 
     System.out.println(distance); 
    } 
} 
+1

У меня нет никаких идей. Почему бы вам не начать с публикации конкретной проблемы, с которой вы столкнулись? – hfontanez

+0

«не работает» очень расплывчато – thermite

+0

@DavidWallace, t есть, чтобы рассказать программе, сколько пар чисел нужно рассчитать для расстояния. – f6e9a

ответ

1

Во втором цикле у вас было 0 меньше t, поэтому переменная управления контуром ничего не делала. Вам нужно изменить его на i меньше, чем на t, поэтому цикл закончится, когда я доберусь до t.

Это решает проблему бесконечного цикла, но я не уверен, работает ли ваша программа. В этом втором цикле вы каждый раз заменяете r и n, поэтому нет цели цикла, потому что r и n будут хранить только последний вход.

Используйте следующий код, чтобы исправить этот метод

 for(int i = 0; i<t; i++) { 
     r = q.nextInt();   //Scans in r (Number of Random Objects) 
     n = q.nextInt();   //Scans in n (Number of Simulations) 
    } 

Если я правильно понимаю ваш вопрос, я думаю, что вы пытаетесь использовать различный г и п для каждой пары. Для этого я бы использовал массив для хранения всех разных значений r и n. Ваш оператор печати также находился за пределами последнего цикла for, поэтому вы могли видеть только результат последней пары.

import java.util.*; 

общественного класса помощь {

public static void main(String[] args) 
{ 

    double distance = 0;   //initiates all numbers needed and sets to 0) 
    int r[]; 
    int n[]; 
    int X1[]; 
    int X2[]; 
    int Y1[]; 
    int Y2[]; 

    Scanner q = new Scanner (System.in); 

    int t = q.nextInt();   //Scans in t (Number of lines to follow) 

    r = new int[t]; 
    n = new int[t]; 
    X1 = new int[t]; 
    X2 = new int[t]; 
    Y1 = new int[t]; 
    Y2 = new int[t]; 

    for(int i = 0; i<t; i++) { 
     r[i] = q.nextInt();   //Scans in r (Number of Random Objects) 
     n[i] = q.nextInt();   //Scans in n (Number of Simulations) 
    } 

    for(int i = 0; i < t; i++) 
    { 
     Random rand = new Random (r[i]); 
     X1[i] = rand.nextInt(n[i]);  // fills index(s) i with Random number in X1 values 
     X2[i] = rand.nextInt(n[i]);  // fills index(s) i with Random number in X2 values 
     Y1[i] = rand.nextInt(n[i]);  // fills index(s) i with Random number in Y1 values 
     Y2[i] = rand.nextInt(n[i]);  // fills index(s) i with Random number in Y2 values 

     distance = Math.sqrt(Math.pow((X2 [i] - X1 [i]), 2) + Math.pow((Y2 [i] - Y1 [i]), 2)); 
     System.out.println(distance); 
    } 

} 

}

+0

@ Ганди Ах хороший глаз, спасибо брату. Я исправил это, но во время консоли отладки я получаю сообщение об ошибке в части случайной генерации. кода. Он останавливается на строке 'X1 [i] = rand.nextInt (n);' – f6e9a

+0

@ f6e9a мой код работает без ошибок. У вас есть какой-либо тестовый ввод/вывод? Какие результаты вы ищете? Вы входите в две точки, так что вы находите расстояние между ними? – Singh

+0

@ f6e9a Редактируйте исходный код, потому что исходный код ha 1000 вместо n. Нам нужно выяснить, с чем вы работаете, чтобы найти проблему. – Singh

0

Вместо чтения в переменной, т, чтобы сказать вам, сколько дополнительных переменных ожидать, вы могли бы сделать что-то вроде следующие:

System.out.println("How many random objects?"); 
r = q.nextInt(); // Scans in r (Number of Random Objects) 

System.out.println("How many simulations?"); 
n = q.nextInt(); // Scans in n (Number of Simulations) 

Это позволит вам увидеть, что происходит на каждом шаге, если что-то пойдет не так, и просто яснее. В любом случае вы должны запросить пользователя программы, когда хотите, чтобы они что-либо вносили.

Кроме того, первый цикл является должен выглядеть следующим образом:

for (int i = 0; i < t; i++) { 
     r = q.nextInt(); // Scans in r (Number of Random Objects) 
     n = q.nextInt(); // Scans in n (Number of Simulations) 
    } 

Или иначе ваш цикл будет продолжаться вечно. Это связано с тем, что второе условие «0 < t» равно всегда истинно, когда t больше 0. Поэтому каждый раз, когда цикл начинается, он будет думать, что это хорошо, а затем никогда не останавливаться.

тот же цикл также не имеет смысла, потому что вам нужно только читать в г и п один раз, но эта установка придется читать их в т раз. Короче говоря, этот цикл не нужен.

Со второй цикл, если он по-прежнему не выполняет, как вы хотите, вы должны вставить некоторые неофициальные отладочные, такие как это:

for (int i = 0; i < n; i++) { 

     // If you want to make it clearer to read 
     System.out.println("-------------------"); 
     System.out.println("i: " + i + ", n: " + n); 

     Random rand = new Random(r); 
     X1[i] = rand.nextInt(1000); // fills index(s) i with Random number 
            // in X1 values 

     System.out.println("X1[" + i + "]: " + X1[i]); 

     X2[i] = rand.nextInt(1000); // fills index(s) i with Random number 
            // in X2 values 

     System.out.println("X2[" + i + "]: " + X2[i]); 

     Y1[i] = rand.nextInt(1000); // fills index(s) i with Random number 
            // in Y1 values 

     System.out.println("Y1[" + i + "]: " + Y1[i]); 

     Y2[i] = rand.nextInt(1000); // fills index(s) i with Random number 
            // in Y2 values 

     System.out.println("Y2[" + i + "]: " + Y2[i]); 

     distance = Math.sqrt(Math.pow((X2[i] - X1[i]), 2) 
       + Math.pow((Y2[i] - Y1[i]), 2)); 

     System.out.println("distance: " + distance); 

     // If you want to make it clearer to read 
     System.out.println("-------------------"); 

    } 

Так что при запуске программы вы можете легко увидеть, что происходит каждый цикл. Это должно указывать, где оно выключено, если вообще.

Последнее, что вы, вероятно, столкнетесь, и IndexOutOfBoundsException во втором цикле, потому что вы идете до i < n, но вы объявляете, что каждый массив имеет размер «10». Поэтому, если в любой точке n> = 10, ваш цикл будет разбит и даст вам это исключение, потому что X1 [10] не существует.

Если вы хотите сохранить эту структуру, вы можете вместо этого читать п перед инициализацией массивов, а затем инициализировать их с н вы читали в Как это:.

System.out.println("How many random objects?"); 
    r = q.nextInt(); // Scans in r (Number of Random Objects) 

    System.out.println("How many simulations?"); 
    n = q.nextInt(); // Scans in n (Number of Simulations) 

    int X1[] = new int[n]; // Array initiations 
    int X2[] = new int[n]; 
    int Y1[] = new int[n]; 
    int Y2[] = new int[n]; 

редактирования: Обновление основанный на обновлении OP.

Если вы хотите рандомизировать семя каждый раз, вам необходимо комбинировать второй цикл с входным семенем. Полный основной метод:

public void main() { 

    double distance = 0; // initiates all numbers needed and sets to 0) 
    int r = 0; 
    int n = 0; 

    Scanner q = new Scanner(System.in); 

    System.out.println("How many simulations?"); 
    n = q.nextInt(); // Scans in n (Number of Simulations) 

    int X1[] = new int[n]; // Array initiations 
    int X2[] = new int[n]; 
    int Y1[] = new int[n]; 
    int Y2[] = new int[n]; 

    for (int i = 0; i < n; i++) { 

     System.out.println("How many random objects?"); 
     r = q.nextInt(); // Scans in r (Number of Random Objects) 

     Random rand = new Random(r); 
     X1[i] = rand.nextInt(1000); // fills index(s) i with Random number 
            // in X1 values 
     X2[i] = rand.nextInt(1000); // fills index(s) i with Random number 
            // in X2 values 
     Y1[i] = rand.nextInt(1000); // fills index(s) i with Random number 
            // in Y1 values 
     Y2[i] = rand.nextInt(1000); // fills index(s) i with Random number 
            // in Y2 values 
     distance = Math.sqrt(Math.pow((X2[i] - X1[i]), 2) 
       + Math.pow((Y2[i] - Y1[i]), 2)); 

     System.out.println("distance: " + distance); 
    } 

    System.out.println(distance); 

    q.close(); 
} 
+0

Я сделал r и n массивов. Сейчас программа работает, я постараюсь больше работать над ней и упростить ее понимание для всех и для меня.Я все еще не получаю правильный ответ из примера ввода, я отключен на 40. – f6e9a

+0

Я обновил конец своего сообщения, чтобы каждый раз обновлять его. Создание r и n массивов усложнит ввод, а не поможет ситуации. Возможно, я ошибаюсь в использовании n. Также обратите внимание на комментарий Дэвида выше. Пожалуйста, не изменяйте оригинальное сообщение снова и снова. –

+0

Bryan Davis Спасибо, что решает мою проблему. Прошу прощения @david Уоллес, я буду помнить об этом. У меня не было намерений запутываться или контрпродуктивно. – f6e9a

Смежные вопросы