我编写了一个简单的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);
}
}
}
}
答案 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)。