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