为什么尝试在无限循环中使用for循环结果上升到2,147,483,647?

时间:2017-08-29 11:31:44

标签: java

我有一个程序(下面的代码),它模拟一个滚动指定数量的卷(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.");
  }
}

2 个答案:

答案 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,则循环将在正确的迭代次数后终止。