所以,我试图做的是计算两点之间的距离。我得到种子和运行的模拟数量。我的代码运行但不起作用?随机生成器不会生成数字并将它们添加到数组中。我用 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);
}
}
答案 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();
}