无法产生随机数?

时间:2014-04-16 09:03:58

标签: java

仓库清单中的每个对象都包含最终库存,安全库存和所需库存。 我的目标是改变一个物体的最终库存,如果小于安全库存的10%,并将其放在安全库存的%10到%5的范围内。要使用随机化器代码执行此操作:

Random random=new Random();
for(Warehouse obj:warehouseList){

    double diff=obj.getEndStock()-obj.getSafetyStock();

    if(((diff/obj.getSafetyStock())*100)<(-5)){
        diff=Math.abs(diff)+(1.05*obj.getSafetyStock())-obj.getSafetyStock();
        if(diff<0)
            Logging.log(diff,"\n");
        int randomNum=0;
        double reqStock=0;
        double end=obj.getEndStock();

        while(((end-obj.getSafetyStock())*100)<(-5)){

            randomNum=random.nextInt((int)diff);
            reqStock+=randomNum;
            end+=randomNum;
        }
        obj.setRequiredStock(reqStock);
        obj.setEndStock(end);


    }
}

}

现在问题:我正在检查diff变量是否变为负数,因为它没有在控制台上打印,但是每当我到达行 randomNum = random.nextInt((int)diff) ; 该程序抛出以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: n must be positive
    at java.util.Random.nextInt(Unknown Source)
    at managing.Final.randomWay(Final.java:163)
    at managing.Final.main(Final.java:252)

任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

这很简单。看看这两行:

double diff=obj.getEndStock()-obj.getSafetyStock();
...
randomNum=random.nextInt((int)diff);

您的diff包含最终库存安全库存之间的差异。如果最终库存低于安全库存,则diff将包含负数。

nextInt方法需要一个正整数作为参数。如果您的diff为否定,则会收到此错误。

编辑:为了回应评论,我再次仔细阅读了这个问题并注意到了我错过的一行。有了这条线:

diff=Math.abs(diff)+(1.05*obj.getSafetyStock())-obj.getSafetyStock();

你实际上可以获得0。 (我假设你的getSafetyStock总会返回一个正数 - 如果没有,那么这可能是你的问题。)

在您的代码中,您正在检查diff是否为0 - 但除了打印日志行之外没有做任何事情。

总的来说,在将diff用作nextInt的参数之前,打印{{1}}的值可能是有意义的,无论它是什么用于调试目的。

答案 1 :(得分:0)

我看不到负值的检查。这里:

 if(diff==0)
            Logging.log(diff,"\n");

你检查零等式,这对于双类型变量来说是奇怪的。

答案 2 :(得分:0)

我觉得我错了。 nextInt方法要求它的参数为,但如果非负,则检查。这就是导致错误的原因。

此代码证明了我的观点:

import java.util.Random;

public class RandomMain {
    public static void main(String[] args) {
        Random random = new Random();
        System.out.println(random.nextInt(0));
    }
}

它会产生异常:

Exception in thread "main" java.lang.IllegalArgumentException: n must be positive
    at java.util.Random.nextInt(Random.java:300)
    at RandomMain.main(RandomMain.java:6)