2013-03-09 115 views
0

我是Comp Sci大學的第一年,在課堂上我們有一個項目,我們爲遊戲製作了一個名爲「百吉餅」的算法。我們要做一個隨機的3位數字,但沒有一個數字可以是相同的數字。所以像「100,220,343和522」這樣的數字將是非法的,因爲它們包含具有相同數字的數字。修復無限循環?

我決定這將是最好的,分別生成每一個數字,比較每個數字和改變,如果需要的話,並添加每個數字爲一個字符串。這裏是我的代碼:

Scanner input = new Scanner(System.in); 

    // Generate a random 3 digit number between 102 and 987. The bounds are 102 to 987 because each 
    // digit in the number must be different. The generated number will be called SecretNum and be 
    // stored as a String. 

    // The First digit is generated between 1 and 9 while the second and third digit are generated 
    // between 0 and 9. 

    String SecretNum = ""; 
    int firstDigit = (int)(Math.random() * 9 + 1); 
    int secondDigit = (int)(Math.random() * 10); 
    int thirdDigit = (int)(Math.random() * 10); 

    // Now the program checks to see if any of the digits share the same value and if one digit shares 
    // the same value then the number is generated repeatedly until the value is different 

    // Digit tests are used to determine whether or not any of the digits share the same value. 
    boolean firstDigitTest = (firstDigit == secondDigit) || (firstDigit == thirdDigit); 

    boolean secondDigitTest = (secondDigit == firstDigit) || (secondDigit == thirdDigit); 

    boolean thirdDigitTest = (thirdDigit == firstDigit) || (thirdDigit == secondDigit); 

    if (firstDigitTest){ 
     do{ 
      firstDigit = (int)(Math.random() * 9 + 1); 
     }while (firstDigitTest); 

    } else if (secondDigitTest){ 
     do{ 
      secondDigit = (int)(Math.random() * 10); 
     }while(secondDigitTest); 

    } else if (thirdDigitTest){ 
     do{ 
      thirdDigit = (int)(Math.random() * 10); 
     }while(thirdDigitTest); 
    }// end if statements 

    // Now the program will place each digit into their respective places 
    SecretNum = firstDigit + "" + secondDigit + "" + thirdDigit; 

    System.out.println(SecretNum); 

(忽略掃描儀現在,這是不必要的這一部分,但後來我需要它)

不幸的是,當我測試的數字,看是否有任何相同的數字,我有時會陷入無限循環。棘手的部分是,它有時會像無限循環一樣運行,但在終止程序之前生成數字。所以有時如果它處於一個無限循環中,我不確定它是真的處於一個無限循環還是我不耐煩,但是我確定這是一個無限循環問題,因爲我等了大約10分鐘,程序仍在運行。

我真的不知道它爲什麼會變成一個無限循環,因爲如果它發生了一個數字匹配另一個數字,那麼數字應該連續生成,直到它是一個不同的數字,所以我不明白它是如何變成一個無限的循環。這是我需要幫助的地方。

(哦,字符串如何我做的不是如何,我會繼續使用它。一旦我得到這個循環固定我會改變它,這樣的數字是附加到字符串。)

回答

4

的問題是(例如)firstDigitTest設置爲特定的布爾值,即truefalse,並且永不改變。即使在將firstDigit設置爲不同的值後,即可解決firstDigitTest檢測到的問題,但您不會重新更新firstDigitTest以檢測問題是否仍然存在。因此,每個循環(如果完全輸入的話)都將無限循環。

我想你可能也只是消除你的布爾變量和循環while(firstDigit == secondDigit || firstDigit == thirdDigit || secondDigit == thirdDigit)

+0

爲什麼有人低估了這個正確的答案? – 2013-03-09 20:27:30

+0

@DonRoby:這個問題的另一個回答者在我的答案被低估的同時丟失了1個重點,所以我認爲他是一個低估了它的人。你可以看到他/她的答案,看看他認爲答案是正確的,因此他爲什麼低估了我的答案。 **更新:**現在他刪除了他/她的回答,並且沒有取消我的回覆,所以我想現在每個人都同意了。 :-) – ruakh 2013-03-09 20:29:04

+0

大聲笑,有趣的社區。無論如何,謝謝你的答案;它工作完美!一旦我閱讀你發佈的內容,我感覺非常愚蠢,但我又是一名新生。哈哈 – 2013-03-09 20:39:47