Java骰子滚动与意外的随机数

时间:2015-06-22 02:53:15

标签: java if-statement

我编写了一个简单的Java程序,用于在控制台上显示20个骰子的结果。我得到的结果如下:

3
1
java.util.Random@62efae3b
1
5
4
1
java.util.Random@62efae3b
1
java.util.Random@62efae3b
java.util.Random@62efae3b
1
6
java.util.Random@62efae3b
1  
java.util.Random@62efae3b
java.util.Random@62efae3b
1
2
3
3

当我跑了几次时," @"之后的字符串是不同的,但基本上是相同的格式。我做错了什么?

以下是代码:

import java.util.Random;

public class QiProb3 {

    public static void main(String[] args) {

        Random diceNumber = new Random();

        for (int count = 0; count <= 20; count++) {
            if ((diceNumber.nextInt(6) + 1) == 1) {
                System.out.println("1");
            } else if ((diceNumber.nextInt(6) + 1) == 2) {
                System.out.println("2");
            } else if ((diceNumber.nextInt(6) + 1) == 3) {
                System.out.println("3");
            } else if ((diceNumber.nextInt(6) + 1) == 4) {
                System.out.println("4");
            } else if ((diceNumber.nextInt(6) + 1) == 5) {
                System.out.println("5");
            } else if ((diceNumber.nextInt(6) + 1) == 6) {
                System.out.println("6");
            } else {
                System.out.println(diceNumber);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:6)

else {
    System.out.println(diceNumber);
}

您正在通过在else子句中调用其默认diceNumber函数来打印toString()的地址。
这就是你得到java.util.Random@62efae3b

的原因

更关键的问题 为什么它会进入'else'条款,我相信这不是您的意图。
注意:在问题中,每个if/else if子句中都会生成一个新数字,这就是代码实际到达最终else子句的原因。

你应该做的是:

for (int count = 0; count < 20; count++) {

    int rollValue = diceNumber.nextInt(6) + 1;

    if (rollValue == 1) {
        System.out.println("1");
    } else if (rollValue == 2) {
        System.out.println("2");
    } else if (rollValue == 3) {
        System.out.println("3");
    } else if (rollValue == 4) {
        System.out.println("4");
    } else if (rollValue == 5) {
        System.out.println("5");
    } else if (rollValue == 6) {
        System.out.println("6");
    } else {
        // This else is now redundant
        System.out.println(diceNumber);
    }
}

或更简单的方法是:

// count < 20 instead of count <= 20
for (int count = 0; count < 20; count++) {

    int rollValue = diceNumber.nextInt(6) + 1;
    System.out.println(rollValue);
}
  

归功于'Elliott Frisch'意识到循环是   执行了21次而不是20次。

答案 1 :(得分:4)

你正在重新滚动

每个if你重新掷骰子。存储值,并测试它!

Random diceNumber = new Random();
for (int count = 0; count <= 20; count++) {
    int roll = diceNumber.nextInt(6) + 1; 
    if (roll == 1) {
        System.out.println("1");
    } else if (roll == 2) {
        System.out.println("2");
    } else if (roll == 3) {
        System.out.println("3");
    } else if (roll == 4) {
        System.out.println("4");
    } else if (roll == 5) {
        System.out.println("5");
    } else if (roll == 6) {
        System.out.println("6");
    } else {
        System.out.println("RNG Error: " + diceNumber);
    }
}

可能更简洁

您发布的代码可能会缩短为

for (int count = 0; count <= 20; count++) {
    int roll = diceNumber.nextInt(6) + 1;
    System.out.println(roll); 
}

注意

此外,您使用上述<= 20测试获得了21卷。

答案 2 :(得分:0)

你可以在没有大的if-else阶梯的情况下做到这一点:

    int x = 0;
    int i = 0;
    while(i < 20){
        x = (int)(Math.random() * 7);
        if(x != 0)
        {
        System.out.println((int)Math.floor(x));
        i++;
        }
    }

Math.random()获取一个介于0和1之间的值,此值乘以7.如果骰子结果为零,则跳过滚动并再执行一次。 Math.floor()值将十进制值向下舍入到最接近的整数(如果product = 6.2则roll的输出将为6)。