2013-03-09 2 views
0

저는 1 학년 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은 특정 부울 값 true 또는 false으로 설정되며 변경되지 않습니다. firstDigit을 다른 값으로 설정하여 firstDigitTest이 감지 된 문제를 해결 한 후에도 firstDigitTest을 다시 업데이트하지 않아도 문제가 계속 발생하는지 확인합니다. 따라서 각각의 루프가 입력되면 무한 루프됩니다.

부울 변수를 없애고 루프 while(firstDigit == secondDigit || firstDigit == thirdDigit || secondDigit == thirdDigit)을 루프 할 수도 있습니다.

+0

누군가이 정답을 왜곡 한 이유는 무엇입니까? –

+0

@DonRoby :이 질문에 대한 다른 답변자는 내 답변이 다운 된 것과 거의 동시에 1 포인트를 잃어 버렸기 때문에 나는 그 사람을 downvoted 것으로 믿습니다. 당신은 그/그녀가 정답이라고 믿는 것을 볼 수있는 대답을 볼 수 있습니다. ** 업데이트 : ** 이제 그는 그/그녀의 대답을 삭제하고 내 마음을 빼앗겼으므로 모든 사람들이 지금 동의하고있는 것 같습니다. :-) – ruakh

+0

롤, 재미있는 커뮤니티. 어쨌든, 답변 주셔서 감사합니다; 완벽하게 작동했습니다! 나는 당신이 게시 한 것을 읽으면 꽤 바보 같았다. 그러나 다시 나는 신입생이다. 하하 –