0

私は1年目のCompSci専攻で、クラスでは「ベーグル」と呼ばれるゲームのアルゴリズムを作成するプロジェクトがあります。ランダムな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

1 に答える 1

4

問題は、(たとえば)がまたはのいずれかfirstDigitTestの特定のブール値に設定されており、変更されないことです。別の値に設定して、検出された問題を解決した後でも、問題がまだ存在するかどうかを検出するために再更新することはありません。したがって、各ループは、入力されたとしても、無期限にループします。truefalsefirstDigitfirstDigitTestfirstDigitTest

ブール変数を削除して、ループする方がよいと思いますwhile(firstDigit == secondDigit || firstDigit == thirdDigit || secondDigit == thirdDigit)

于 2013-03-09T20:26:06.570 に答える