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

WE HAVE NEW X,Y,Z Match 1 1 1 CHANGING X Match 1 1 1 CHANGING X Match 1 1 1 CHANGING X Match 1 1 1 CHANGING X Match 1 1 1 CHANGING X Match 1 1 1 CHANGING X Match 1 1 1 CHANGING Xマッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING X マッチ 1 1 1 CHANGING 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

1つの問題はここにあります

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

静的 ints x、y、および z をそれぞれ 1、2、および 3 に初期化したので、x < y のテストは真であり、y < z は真であるため、x2 を x などに割り当てるブロックを実行します。

ただし、ランダムに選択した数値が x2 < y2 および y2 < z2 であるという保証はありません。新しい値は、最初にその if ステートメントにヒットしたときに設定されますが、ランダムな x2、y2、および z2 がたまたま昇順であるというまれなイベントを除いて、その後いつでも設定される可能性は低いです。

必要なのは、新しい x、y、および z 値を割り当てるまで乱数changeX()を生成し続けるためのループです。何かのようなものx2 < y2 && y2 < z2

do {
    ... // set new random values for x2, y2, and z2
} while (! (x2 < y2 && y2 < z2) );

ただし、このループは、たまたま昇順で 3 つの値を取得するまで、非常に長い時間実行される可能性があることに注意してください。

一般に、ランダムな値は、方程式の解を求めるのに適した方法ではありません。同じ 3 つの値を繰り返し試すことができます。

x2 < y2 のような x2 と y2 が与えられた場合、方程式を解く可能性のある z2 の値の下限があります。1つのアプローチは

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 に答える