1

我正在尝试为方程找到一组给定的数字

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;

公共课练习曲14 {

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 改变 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

4

3 回答 3

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.
}
于 2012-09-11T00:36:02.937 回答
1

这里有一个问题

if(x < y && y < z){
    x = x2;
    y = y2;
    z = z2;
    return;
}

您已将静态整数 x、y 和 z 分别初始化为 1、2 和 3,因此您对 x < y 的测试为真且 y < z 为真,因此您执行将 x2 分配给 x 等的块。

但是对于随机选择的数字,不能保证 x2 < y2 和 y2 < 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 < y2 有可能解方程的 z2 值的下限。一种方法可能是

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

即使这种方法也非常幼稚——正如@HotLicks 在评论中提到的那样,牛顿近似方法的一些变化是一个更好的起点。

于 2012-09-11T00:45:41.290 回答
1

当 z 变成一个小数时,您的随机发生器“停止”生成。

在这种情况下,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);

}
于 2012-09-11T00:46:30.507 回答