我有一个程序(下面的代码),它模拟一个滚动指定数量的卷(num;
)的骰子,然后打印结果。
由于某种原因,程序可以完成的最大滚动量为2,147,483,583,而不是2,147,483,647的内部限制。当输入2,147,483,647作为滚动数时,程序根本不会产生输出。
这是否有特定原因?
import java.security.SecureRandom;
public class RollDie {
// number of rolls
private static float num = 2147483583;
public static void main(String[] args) throws InterruptedException {
long start = System.currentTimeMillis();
System.out.print("Rolling...\n");
SecureRandom randomNumbers = new SecureRandom();
int frequency1 = 0;
int frequency2 = 0;
int frequency3 = 0;
int frequency4 = 0;
int frequency5 = 0;
int frequency6 = 0;
for (int roll = 1; roll <= num; roll++) {
// randomly selecting face ('rolling')
int face = 1 + randomNumbers.nextInt(6);
switch (face) {
case 1:
++frequency1;
break;
case 2:
++frequency2;
break;
case 3:
++frequency3;
break;
case 4:
++frequency4;
break;
case 5:
++frequency5;
break;
case 6:
++frequency6;
break;
}
}
long end = System.currentTimeMillis();
long totalTime = ((end - start) / 1000);
// displaying results
System.out.println("\nFace\tFrequency");
System.out.printf("1\t%d%n2\t%d%n3\t%d%n4\t%d%n5\t%d%n6\t%d%n",
frequency1, frequency2, frequency3, frequency4, frequency5,
frequency6);
System.out.println("\nTime taken: " + totalTime + " seconds.");
}
}
答案 0 :(得分:3)
没有输出,因为for循环永远不会终止。您必须将条件从for (int roll = 1; roll <= num; roll++)
更改为for (int roll = 0; roll < num; roll++)
。
在您的情况下,roll达到Integer.MAX_VALUE,条件仍然为真,因此再次输入循环。现在滚动增加,溢出到Integer.MIN_VALUE,并且仍然&lt; = num
。因此,for循环永远不会停止。
此外,您num
float
遇到问题,请参阅Eran's answer获取解释。
答案 1 :(得分:2)
您的num
变量属于float
类型。 float
类型的精确度有限,因此无法准确表示任何较大的int
值。
Malte指出了第二个问题 - 由于Integer.MAX_VALUE
溢出,您将限制设置为int
时,您的循环终止了。
如果您将num
更改为int
并将循环条件更改为roll < num
,则循环将在正确的迭代次数后终止。