我试图找到等式的一组给定数字
x^3 + y^3 = z^3 +1
其中
x < y < z
以下代码是我开始研究的内容。我目前遇到的问题是我生成的随机数只会在第一次运行程序时生成,我无法弄清楚为什么有任何帮助或线索如何改进我的代码将非常感激。
import java.util.Random;
public class etude14 {
static int x = 1;
static int y = 2;
static int z = 3;
static int matchCount = 0;
public static void main(String[] args) {
while(matchCount < 23){
equatition(x, y, z);
}
}
public static void equatition(int x, int y, int z) {
double leftResult = Math.pow(x, 3) + Math.pow(y, 3);
double rightResult = Math.pow(z, 3) + 1;
if (leftResult == rightResult) {
System.out.println("Match " + x + " " + y + " " + z);
matchCount++;
changeX();
} else {
System.out.println("No Match " + x + " " + y + " " + z);
changeX();
}
}
private static void changeX() {
Random generator = new Random();
int x2 = generator.nextInt(10000) + 1;
int y2 = generator.nextInt(10000) + 1;
int z2 = generator.nextInt(10000) + 1;
if(x < y && y < z){
System.out.println("WE HAVE NEW X,Y,Z");
x = x2;
y = y2;
z = z2;
return;
}
System.out.println("CHANGING X");
}
}
第一次回答后的代码
import java.util.Random;
public class etude14 {
static int x = 1;
static int y = 2;
static int z = 3;
static int matchCount = 0;
public static void main(String[] args) {
while (matchCount < 23) {
equatition(x, y, z);
}
}
public static void equatition(int x, int y, int z) {
double leftResult = Math.pow(x, 3) + Math.pow(y, 3);
double rightResult = Math.pow(z, 3) + 1;
if (leftResult == rightResult) {
System.out.println("Match " + x + " " + y + " " + z);
matchCount++;
changeX();
} else {
System.out.println("No Match " + x + " " + y + " " + z);
changeX();
}
}
private static void changeX() {
Random generator = new Random();
int x2 = 1;
int y2 = 1;
int z2 = 1;
if (x < y && y < z) {
System.out.println("WE HAVE NEW X,Y,Z");
x = x2;
y = y2;
z = z2;
return;
} else {
x2 = generator.nextInt(10000) + 1;
y2 = generator.nextInt(10000) + 1;
z2 = generator.nextInt(10000) + 1;
System.out.println("CHANGING X");
}
}
}
输出
No Match 1 2 3
我们有新的X,Y,Z 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X. 比赛1 1 1 改变X
答案 0 :(得分:1)
if(x < y && y < z){
System.out.println("WE HAVE NEW X,Y,Z");
x = x2;
y = y2;
z = z2;
return;
}
试试这个:
if(x2 < y2 && y2 < z2){
System.out.println("WE HAVE NEW X,Y,Z");
x = x2;
y = y2;
z = z2;
return;
}
else{
//repeat the procedure for generating random numbers.
// You have one-sixth possibility but that is not quite much.
}
答案 1 :(得分:1)
这里有一个问题
if(x < y && y < z){
x = x2;
y = y2;
z = z2;
return;
}
您已将静态整数x,y和z分别初始化为1,2和3,因此您的x&lt; x&lt; y是真的,y&lt; z为真,因此您执行将x2分配给x等的块。
但是不能保证x2&lt; y2和y2&lt; z2为您随机选择的数字。新值在第一次触发if语句时设置,但在此之后不可能随时设置,除非你的随机x2,y2和z2恰好按升序排列。
您需要的是changeX()
中的循环,以便继续生成随机数,直到x2 < y2 && y2 < z2
和然后分配新的x,y和z值。像
do {
... // set new random values for x2, y2, and z2
} while (! (x2 < y2 && y2 < z2) );
但是,请注意,此循环可能会运行很长时间,直到您按顺序获得3个值。
随机值一般不是寻求方程式求解的好方法 - 您可以重复尝试相同的3个值。
给定x2和y2使得x2 即使这种方法也非常幼稚 - 正如@HotLicks在评论中提到的那样,牛顿近似方法的一些变化是一个更好的起点。x2 = random number from 1 to 10,000
y2 = random number from x2+1 to 10,000
z2 = method_to_guess_a_lower_limit_for_z2(x2, y2);
答案 2 :(得分:1)
当z变为小数时,你的随机genetator'停止'生成。
在这种情况下,很少会验证条件if(x2 < y2 && y2 < z2)
,因此您的号码不会更改。
你需要像
这样的东西private static void changeX() {
Random generator = new Random();
int x2 = generator.nextInt(10000) + 1;
int y2 = generator.nextInt(10000) + 1;
int z2 = generator.nextInt(10000) + 1;
x = Math.min(Math.min(x2, y2), z2); // The Max of the 3 numbers
z = Math.max(Math.max(x2, y2), z2); // The Min of the 3 numbers
if (x != x2 && z != x2) { // The remaining middle number
y = x2;
} else if (x != y2 && z != y2) {
y = y2;
} else {
y = z2;
}
}
或者
private static void changeX() {
Random generator = new Random();
List<Integer> listInt = new ArrayList<Integer>();
int x2 = generator.nextInt(10000) + 1;
listInt.add(x2);
int y2 = generator.nextInt(10000) + 1;
listInt.add(y2);
int z2 = generator.nextInt(10000) + 1;
listInt.add(z2);
Collections.sort(listInt);
x = listInt.get(0);
y = listInt.get(1);
z = listInt.get(2);
}