我有一个程序(代码如下),模拟一个骰子滚动指定数量的卷(num;
),然后打印结果。 出于某种原因,程序可以完成的最大滚动数量是2,147,483,583,而不是2,147,483,647的整数限制。当输入2,147,483,647作为卷的数量时,程序根本不会产生输出。为什么试图通过for循环导致无限循环而达到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.");
}
}
如果你调试了一下以找出这里发生了什么,并询问了一个更具体的问题(或两个),这个问题将具有更多的未来价值。 – Dukeling
有关如何编辑我的帖子以改善它的任何建议? @Dukeling –
问题是,要达到这个问题的理想版本将需要对您的问题进行根本改变,但在此阶段这样做会使部分答案无效,这并不好。更具体地说,这里有两个问题 - (1)试图用'float'表示大整数,(2)试图循环到2,147,483,647 - 理想情况下应该是两个单独的问题,但两个答案都解决这两个问题,所以你现在无法真正缩小它的范围。但是,您可以做的是[尽可能减少代码](https://ideone.com/CVZ0Gr)。 – Dukeling