2

私は自分で(クラス/教師/家庭教師などなしで)Javaプログラミングを学ぼうとしているので、これは宿題ではありません。

私の質問は、初心者向けのJavaチャレンジでほのめかされています。whileループで乱数を生成しますが、この質問をした前のプログラマーが述べたように、ArrayListsをカバーするのに十分なほどこの本に進んでいません。

この質問に答えることは、ほとんどの初心者プログラマーがwhileループのステートメントを書く方法をよりよく理解するのに役立ちます。これは、特に初心者にとっては、しばしば複雑なプロセスです。

問題は、1から100までの乱数を生成し、同じ数を2回生成した後にループを停止するwhileループを作成することです。

ご存知のように、このプログラムを実行すると、実行するたびに1から100までの2つの乱数の出力のみが作成されます。17行目が原因でこのエラーが発生したと思います。equal=numberCheck== values [i]; これは、whileループ条件が真になり、評価を停止するタイミングを定義するステートメントであるため、正しくありません。

どんな助けでも大歓迎です。ありがとうございました。

私のコードは次のとおりです。

import java.util.Random;

public class SameNumber {

    public static void main(String args[]) {

        Random rand = new Random();
        int[] values = new int[100];
        int counter = 0;
        boolean equal = false;

        for (int i = 0; i < 2; i++) {
            values[i] = rand.nextInt(100) + 1;
            System.out.println(values[i]);
            int numberCheck;
        }

        while (!equal) {
            for(int i = counter - 1; i >= 0; i--) {
                int numberCheck = values[i];
                equal = numberCheck == values[i];
             //}
                if (!equal) {
                    System.out.println(rand.nextInt(100) + 1);
                }

                for (int j = counter - 1; j >= 0; j--) {
                    if (numberCheck  == values[j]) {
                        break;
                    }
                }
            }
        }
    }
}

PS:これはばかげているように聞こえるかもしれませんが、私はこの問題に約1週間取り組んでおり、追加の調査を収集しようとしていますが、それでも適切な解決策にたどり着くことができませんでした。他のプログラマーが私がまだ学んでいない方法で答えてしまうのではないかと心配しているので、私は助けを求めるのをためらっています。

4

4 に答える 4

3

あなたのアプローチはかなり間接的です...指示に従って直接試してみましょう:

  1. 新しい乱数を生成する
  2. この乱数を見たことがあるかどうかを判断する
  3. いいえ?この乱数を見たことを記録し、1 に進みます。
  4. はい?止まる

次に、本当の問題は、「以前に乱数を見たことがあるかどうかをどのように判断するのですか?」です。

これは有限集合なので、boolean seen[100]false に初期化するブール配列 ( ) を持つことができます。数字が表示されるたびに、 としてマークseen[<number>]trueます。が true の場合seen[<number from 2>]は、以前に生成したことがあります。

ところで、これらを追跡するためにを使用するArrayListことは、データ構造にとって最良の選択ではありません。Java コレクションを確認する準備ができたら、 を確認してくださいHashSet。これは、一定時間 (リストのサイズに依存しません) 実行されcontainsます。

于 2012-08-16T22:32:11.103 に答える
1

valuesブール値の配列に設定し、数値が存在する場合は true に設定します。次に、乱数をその配列のインデックスとして使用します。

boolean[] values = new boolean[100];

int index = Random.nextInt(100);
while(!values[index]){
    System.out.println(index+1);
    values[index] = true;
    index = Random.nextInt(100);
}
于 2012-08-16T22:34:03.687 に答える
0

これは宿題ではありませんが(これが宿題ではないと主張する宿題の質問の傾向を開始しないことを願っています)、解決策ではなく、ポインターによって助けられると思います。

あなたのコードが実際に何をしているのかを擬似コード英語で書き直して、どこが間違っているのかがわかるようにします。

乱数ジェネレーターを作成する
100要素の配列を作成する
カウンターを初期化する
ブール値を初期化します
2回ループし、最初の乱数に2つの乱数を割り当てます
     100要素配列の2つの要素(これは問題です)
ループ内:割り当てられた番号の値を出力します
ループ内:コンパイラによって無視される意味のない行
上記で初期化されたブール値がtrueになるまでループを開始します
ループを開始し、カウント変数を-1に初期化します
    ゼロ以上になると停止し、減少します
    毎回(つまり、これは実行されません)。
ループ内:配列内の不正な位置を参照します(-1以下)
    そしてそれを変数に割り当てます(これは問題です)
ループ内:割り当てた変数が何と等しいかを確認します
    割り当てたばかりです(これは問題です)
ループ内:それが行われない場合(それは起こり得ない)、乱数を出力します
    これまでに起こったこととは無関係です(これは問題です)
ループ内:他のループと同じ問題でネストされたループを開始します
ネストされたループの場合:すべての値を確認します
    (それらは違法に参照されていますが)配列内の数は
    外側のループから引っ張られます。[これは一種のポイントですが、
    この時点までの問題が多すぎて、この行を修正することさえ考えられません]
于 2012-08-16T22:55:52.950 に答える
0

これを試してみてください: 1. 0 から 100 までの乱数を作成します。 2. リストに含まれていない場合は、リストに追加します。3. 新しく生成された番号が既に arraylist 内にある場合は停止します

import java.util.ArrayList;
import java.util.Random;

public class SameNumber {
    public static void main(String args[]) {
        Random rand = new Random();
        ArrayList<Integer> list=new ArrayList<Integer>();       
        int newRand=rand.nextInt(100);
        while(!list.contains(newRand)){
            list.add(newRand);
            newRand=rand.nextInt(100);
        }
        System.out.print(list);
    }
}
于 2012-08-16T22:32:02.960 に答える