0

問題は次のとおりです。数字が大きいか小さいか(どちらでもかまいません)で、この数字を微調整して計算する必要があります。計算の結果を考えると、少なくとも小数第 5 位で特定の値に一致する必要があります。

したがって、この開始値を取得し、正しい結果が得られるまで、現在の結果が何であるかを指定して増加または減少させるメソッドを作成する必要があります。私はいくつかの試みをしましたが、成功しませんでした。

これはまったく機能しない例ですが、私が何を意味するかを示唆しています...(これは単なる小規模なテストケースです)

   public class Test {
        public static void main(String[]args)
        {
            double ran = 100 + (int)(Math.random() * 100000.999999999);
            int count = 0;              
            double tmpPay = 3666.545;
            double top = tmpPay;
            double low = 0;             

            while ( tmpPay != ran )
            {
                if ( tmpPay > ran)
                {
                    if( low == 0)
                    {
                            tmpPay = top / 2;
                            top = tmpPay;
                    }
                    else
                    {
                        tmpPay = tmpPay + ((top - low) / 2);
                        top = tmpPay;
                    }        
                }           

                if (tmpPay  < ran)
                {
                    tmpPay = top * 1.5;
                    low = top;
                    top = tmpPay;                   
                }
            }
            System.out.println(" VAlue of RAN: " +ran + "----VALUE OF tmpPay: " + tmpPay + "---------- COUNTER: " + count);         
}

例 2 は、より明確な説明かもしれません。これが今の私の解決策です..

guessingValue = firstImput;

while (amortization > tmpPV)
{
    guessingValue -= (decimal)1;
    //guessingVlue -- > blackbox
    amortization = blackboxResults;
}
 while (amortization < tmpPV)
{
    guessingValue += (decimal)0.00001;
    //guessingVlue -- > blackbox
    amortization = blackboxResults;
}

}

4

4 に答える 4

1

プログラムを実行しようとすると、while 条件 (double 値の比較用) がほとんど等しくならないため、簡単に無限ループに入ります。例: 次の 2 つの値があります。

二重値1 = 3666.545 ;

二重値2 = 3666.54500001 ;

value1 == value2 は偽です。

この種の値でさえ等しくありません。

偏差の範囲を定義した方がよいでしょう。

例: |値 1 - 値 2| の場合 < 0.005 の場合、while 条件を破り、乱数情報を出力します。

于 2013-10-29T13:00:22.120 に答える
1

上記のコメントで既に述べたように、組み込み演算子を使用して double を比較するべきではありません。これが、コードが機能しない主な理由です。2 つ目は、else 節の tmpPay = tmpPay + ((top-low) /2); です。tmpPay = tmpPay - ((top-low) /2 ); の代わりに

完全な修正コードは次のとおりです。

public class Test {
    private static final double EPSILON = 0.00001;
    public static boolean isEqual( double a, double b){

        return (Math.abs(a - b) < EPSILON);

    }


    public static void main(String[]args)
    {

        double ran = 100 + (int)(Math.random() * 100000.999999999);
        int count = 0;              
        double tmpPay = 3666.545;
        double top = tmpPay;
        double low = 0;             

        while ( !isEqual(tmpPay, ran))
        {
            if ( tmpPay > ran)
            {
                if( isEqual(low, 0.0))
                {
                        tmpPay = top / 2;
                        top = tmpPay;
                }
                else
                {
                    tmpPay = tmpPay - ((top - low) / 2);
                    top = tmpPay;
                }        
            }           

            if (tmpPay  < ran)
            {
                tmpPay = top * 1.5;
                low = top;
                top = tmpPay;                   
            }
            System.out.println("RAN:"+ran+" tmpPay:"+tmpPay+" top:"+top+" low:"+low+" counter:"+count);
            count++;
        }
        System.out.println(" VAlue of RAN: " +ran + "----VALUE OF tmpPay: " + tmpPay + "---------- COUNTER: " + count);




    }
}
于 2013-10-29T13:32:54.823 に答える