Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找到一个;“正确”;计算前未知的值_Java_Algorithm - Fatal编程技术网

Java 找到一个;“正确”;计算前未知的值

Java 找到一个;“正确”;计算前未知的值,java,algorithm,Java,Algorithm,问题是,我有一个大的或小的数字(可以是一个),我需要调整这个数字,并把它通过计算。给定计算结果,它必须至少在第五位小数点处有一个特定值 所以我需要做一个方法,取这个起始值,根据当前结果,尝试增加或减少它,直到得到正确的结果。我做了一些尝试,但没有成功 这里有一个例子,不会胡闹,但它暗示了我的意思。。。(这只是一个小规模的测试用例) 公共类测试{ 公共静态void main(字符串[]args) { 双随机数=100+(int)(Math.random()*100000.99999999); 整数

问题是,我有一个大的或小的数字(可以是一个),我需要调整这个数字,并把它通过计算。给定计算结果,它必须至少在第五位小数点处有一个特定值

所以我需要做一个方法,取这个起始值,根据当前结果,尝试增加或减少它,直到得到正确的结果。我做了一些尝试,但没有成功

这里有一个例子,不会胡闹,但它暗示了我的意思。。。(这只是一个小规模的测试用例)

公共类测试{
公共静态void main(字符串[]args)
{
双随机数=100+(int)(Math.random()*100000.99999999);
整数计数=0;
双tmpPay=3666.545;
双顶部=tmpPay;
双低=0;
while(tmpPay!=ran)
{
如果(tmpPay>ran)
{
如果(低==0)
{
tmpPay=top/2;
top=tmpPay;
}
其他的
{
tmpPay=tmpPay+((上下)/2);
top=tmpPay;
}        
}           
如果(tmpPay
例2:这是我现在的解决方案

guessingValue = firstImput;

while (amortization > tmpPV)
{
    guessingValue -= (decimal)1;
    //guessingVlue -- > blackbox
    amortization = blackboxResults;
}
 while (amortization < tmpPV)
{
    guessingValue += (decimal)0.00001;
    //guessingVlue -- > blackbox
    amortization = blackboxResults;
}
gustingvalue=firstImput;
而(摊销>tmpPV)
{
猜测值-=(十进制)1;
//猜测vLUE-->黑盒
摊销=结果;
}
而(摊销黑盒
摊销=结果;
}

}一种方法是将您的问题定义为一个问题,并使用本地优化器(例如Brent的方法或Nelder-Mead Simplex)


这里的目标函数是期望值与从黑匣子中得到的值之间的距离。

一种方法是将问题定义为一个局部优化器,并使用局部优化器(例如Brent方法或Nelder-Mead单纯形)


这里的目标函数是期望值和从黑匣子中得到的值之间的距离。

如果我理解正确,你有一个函数g(x)和一个值K,你想找到x0,使得g(x0)=K。 这相当于找到函数f(x)=g(x)-K的根,因为f(x0)==f(x0)-K==K-K==0


一个简单的算法是。

如果我理解正确,你有一个函数g(x)和一个值K,你想找到x0,这样g(x0)=K。 这相当于找到函数f(x)=g(x)-K的根,因为f(x0)==f(x0)-K==K-K==0


一个简单的算法是。

如果试图运行程序,它很容易在无限循环中,因为while条件(用于双值比较)很难相等。 例如 有两个值,如下所示:

双值1=3666.545

双值2=3666.54500001

value1==value2为false

即使这种价值观也不平等

你最好定义一个偏差范围


e、 g,如果| value1-value2 |<0.005,则打破while条件并打印随机num信息。

如果尝试运行该程序,它将很容易在无限循环中,因为while条件(用于双值比较)几乎不能相等。 例如 有两个值,如下所示:

双值1=3666.545

双值2=3666.54500001

value1==value2为false

即使这种价值观也不平等

你最好定义一个偏差范围


e、 g,如果| value1-value2 |<0.005,则打破while条件并打印随机num信息。

正如我在上面的评论中已经提到的,您不应该使用内置运算符比较双精度。这是代码不起作用的主要原因。第二个是else条款中的tmpPay=tmpPay+((上下)/2);而不是tmpPay=tmpPay-((上下)/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);




    }
}
公共类测试{
私有静态最终双ε=0.00001;
公共静态布尔相等(双a,双b){
返回值(数学abs(a-b)ran)
{
if(等质量(低,0.0))
{
tmpPay=top/2;
top=tmpPay;
}
其他的
{
tmpPay=tmpPay-((上下)/2);
top=tmpPay;
}        
}           
如果(tmpPay
正如我在评论中提到的
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);




    }
}