2017-10-30 5 views
-1

ループを使用して重複なしで4つの乱数を生成しようとしていますが、ArrayIndexOutOfBoundsExceptionがあります。誰かが理由を説明できますか?なぜこのコードは4つの異なる乱数を生成してArrayIndexOutOfBoundsExceptionをスローしますか?

// SECRET ANSWER 
int secret[] = new int[4]; 
for (int i = 0; i < secret.length; i++) { 
    secret[i] = (int) (Math.random() * 6 + 1); 

    if (secret[i] == secret[i + 1] || secret[i] == secret[i + 2] || secret[i] == secret[i + 3]) { 
     secret[i] = (int) (Math.random() * 6 + 1); 
    } 

    if (secret[i + 1] == secret[i + 2] || secret[i + 1] == secret[i + 3]) { 
     secret[i] = (int) (Math.random() * 6 + 1); 
    } 

    if (secret[i + 2] == secret[i + 3]) { 
     secret[i] = (int) (Math.random() * 6 + 1); 
    } 
} 
+0

あなたは長さ4の配列を持っていて、3よりも大きいインデックスにアクセスした場合、その後、あなたが境界エラーのうちのインデックスを取得します。あなたのコード内でどこに起こっているのか見ていますか? – astidham2003

答えて

0

したがって、配列の最後の要素にいる状況を想像してください。 あなたは存在しないI + 1、I + 2、I + 3要素を取得しようとします。あなたは制限を長さ3に変更するか、同様のことをする必要があります

0

あなたは配列サイズ4について言及しています。そのため、あなたはその例外を取得しています。実行時にサイズが大きくなることはありません。この問題を解決するには、コレクションフレームワークを使用します。

0

forループの2番目の反復では、i1です。 'または'チェーンの最初の2つの条件は偽であるため、3番目の値が評価され、secret[i + 3]にアクセスします。 i + 34ですが、秘密のインデックスは03です。あなたのアルゴリズムは意味をなさない。

この範囲[1..6]で4つの異なる乱数の配列を生成する:

Random rand = new Random(); 
int[] secret = rand.ints(1, 7).distinct().limit(4).toArray(); 

もしforループを使用する必要がある場合、ネストしたforループを使用して、現在のインデックスの前にすべての要素を確認する必要があり、が、これはあなたが確認する必要があるためです。 whileループを使用して、まだ生成されていない乱数が得られるまで乱数を生成し続けるようにする必要があります。例えば

int[] secret = new int[4]; 
for (int i = 0; i < secret.length; i++) { 
    int n; 
    boolean distinct; 
    do { 
     distinct = true; 
     n = (int) (Math.random() * 6 + 1); 
     for (int j = 0; j < i; j++) { 
      if (secret[j] == n) { 
       distinct = false; 
      } 
     } 
    } while (!distinct); 
    secret[i] = n; 
} 
+0

ありがとう、これは多くの助け:) – payneivjoker

関連する問題