我有一個程序(代碼如下),模擬一個骰子滾動指定數量的卷(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