具有随机整数的距离公式。产出没有产生

时间:2014-11-26 18:15:20

标签: java

所以,我试图做的是计算两点之间的距离。我得到种子和运行的模拟数量。我的代码运行但不起作用?随机生成器不会生成数字并将它们添加到数组中。我用 r 播种随机生成器,并使用 n 运行模拟。

编辑:我通过控制台输入输入后,程序卡在循环中它卡在第X1[i] = rand.nextInt(1000);行。

示例输入

2 --- t(待测试的巴黎数量)

12087 400 --- r,n(r =种子变量的数量,n =运行rand的次数)

7418 978 --- r,n(第二个r和n)

示例输出示例输出---(这是书中的)

553.994 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);
    }
}

2 个答案:

答案 0 :(得分: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。为了实现这一点,我将使用一个数组来存储所有不同的r和n值。你的print语句也在最后一个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);
    }

}

}

答案 1 :(得分:0)

不是读取变量 t ,而是告诉您需要多少额外变量,您可以执行以下操作:

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循环需要如下所示:

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)
    }

否则你的循环将永远持续下去。这是因为第二个条件&#34; 0&lt; T&#34;当t大于0时,总是为真。因此,每次循环开始时,它都会认为它很好,然后永远不会停止。

同样的循环也没有意义,因为你只需要读入 r n 一次,但是这个设置会让你在<强> t 次。简而言之,这个循环是不必要的。

使用第二个循环,如果它仍未按您的意愿执行,您应该插入一些非正式的调试语句,例如:

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因为你要去,直到我&lt; n,但是你声明每个数组的大小为&#34; 10&#34;。因此,如果在任何时候n> = 10,你的循环将会中断并给你那个例外,因为X1 [10]不存在。

如果你想保留这个结构,你可以在初始化数组之前读入 n ,然后用你读入的 n 初始化它们。像这样:< / p>

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();
}