min和max值随机生成器java出错

时间:2015-01-12 12:37:54

标签: java eclipse

当我输入最小值和最大值时,它会显示这些bounderies之外的值。为什么是这样?例如:

Enter minimum value: 20
Enter maximum value: 40
Your number is: 50

还有其他代码,但一切正常。以下是不起作用的方法:

public void randomNumberMinMax(){

    int min;
    int max;

    System.out.print("Enter minimum value: ");
    min = myScan.nextInt();

    System.out.print("Enter maximum value: ");
    max = myScan.nextInt();

    int i = (int)(Math.random() * max) + min;
    System.out.println("Your number is: " + i);
    if (i < min || i >= max);
}   

public static void main(String[] args) {
    RandomNumberGenerator generator = new RandomNumberGenerator();
    generator.randomNumberMinMax();

3 个答案:

答案 0 :(得分:0)

您当前正在使用不正确的边界生成随机数。你有像

这样的代码
int i = (int)(Math.random() * max) + min;

假设Math.random生成类似0.9939045240919046的值,然后您将此值乘以40,后者变为39,756180964,然后您添加20它,它给你

39,756180964 + 20 = 59,756180964

您可以使用

进行更正
int i = new Random().nextInt(max - min + 1) + min // this will generate number b/w min and max inclusive

答案 1 :(得分:0)

我建议更换一行:

int i =(int)(Math.random()* max)+ min;

int i =(new Random())。nextInt(max-min)+ min;

答案 2 :(得分:-1)

使用像here RandomUtil class这样的随机生成器,您可以在某些值和更多值之间创建随机数。

public static void main(String[] args) {
    int minRange = -20;
    int maxRange = 20;
    for (int i = 0; i < 100; i++) {
        int number = getRandomPrimitiveInt(minRange, maxRange);
        System.out.println(number);
    }

}

public static int getRandomPrimitiveInt(int minRange, int maxRange) {
    if (minRange < 0){
        int value = (int) ((Math.random() * (maxRange + Const.ONE)) + Const.ZERO);
        if (getPositiveOrNegative()){
            return value;
        } else {
            return Math.negateExact(value);
        }
    } else {
        return (int) ((Math.random() * (maxRange - minRange + Const.ONE)) + minRange);
    }
}

private static boolean getPositiveOrNegative() {
    int lRandomNumber = (int) (Math.random() * Const.THREE);
    if (lRandomNumber % Const.TWO == Const.ZERO) {
        return true;
    } else {
        return false;
    }
}