如何在while循环中随机无误?

时间:2014-03-17 23:48:36

标签: java random while-loop

我有一个公共双重方法:bisectie有2个双参数,当我在一个范围内随机使用这些参数时,我有一些错误我无法处理它们。

"Exception in thread "main" java.lang.IllegalArgumentException: n must be positive
    at java.util.Random.nextInt(Unknown Source)
    at BisectieOptimizata.bisectie(BisectieOptimizata.java:23)
    at BisectieOptimizata.main(BisectieOptimizata.java:39) "

以下是源代码:

import java.util.Random;

public class BisectieOptimizata {

    public  double c;
    public double eps = 0.01;

    //test function
    public double functie(double x){
        return x*x - 2*x + 1;
    }
    //derivata
    public double derivata(double x){
        return (functie(x+eps)-functie(x))/eps;
    }
    //bisection algh.
    public double bisectie(double a, double b){

        Random rand = new Random();
        double err = 0.001;

        while(Math.abs(b-a)>err){

            c = rand.nextInt((int)((b - a) + 1)) + a + rand.nextDouble(); // random a number from a range, ex: [-10;11), I random 4.542 

            if(derivata(c)<0){
                if(derivata(c)<a) a = c-a;
                else a = c;
            }else {
                if(derivata(c)>b) b = c-b;
                else b = c;

            }
        }
        return (a+b)/2;
    }
    public static void main(String[] args){

        BisectieOptimizata BO = new BisectieOptimizata();
        System.out.println(BO.bisectie(-10, 10)); // a = -10, b = 10
    }
}

2 个答案:

答案 0 :(得分:1)

我发现你正在比较(Math.abs(b - a)&gt; err)所以负数可以 也是大于0.001,因为它是Math.abs。

这会导致你在rand.nextInt()中的值变为负值。

a和b的值在程序中改变如下

10.0
-10.0

10.0
-2.5993084021357675

0.1896164396715161
-2.5993084021357675

0.1896164396715161    
1.5161487751844813  ---> error

这里(a-b)+1 = -0.32653233551。现在,Math.abs(b - a)值为1.32653233551,这显然符合循环标准。

但是当值(a-b)+1传递给rand.nextInt()时,它会产生一个异常,因为数字为负数。

我不确定你在使用算法做什么,但删除Math.abs确实解决了这个问题。

答案 1 :(得分:0)

该例外提供了有意义的信息:

"Exception in thread "main" java.lang.IllegalArgumentException: n must be positive
    at java.util.Random.nextInt(Unknown Source)
    at BisectieOptimizata.bisectie(BisectieOptimizata.java:23)
    at BisectieOptimizata.main(BisectieOptimizata.java:39) "

那么,您是否确保nextInt的参数在您的代码中使用它的任何地方都是正面的?看来不是。

rand.nextInt((int)((b - a) + 1)) + a + rand.nextDouble();

也许你忘了在这里表演Math.abs?没有更多信息,很难知道。在IDE中调试此问题很容易。您可以设置一个“例外断点”&#39;在Intellij中,在抛出此异常的位置捕获程序,并检查内存中可用的调用堆栈和变量。

或者只需在致电nextInt之前添加此打印声明:

        System.out.println((int)((b - a) + 1));

并且您注意到只有当表达式的值为负时才会失败。