0

そのため、1 から 25 までのランダムな一意の番号を使用して、長さ 3 の配列を生成しようとしています。コードが機能しない理由がわかりません。助けていただければ幸いです。

public void generateRandom() {
    for(int j=0; j<3; j++) {
        dots[j] = (int) (Math.random()*(col*row)+1);
        System.out.println(dots[j]);
        for(int i=j; i>0; i--) {
            if(dots[j]==dots[j-1]) {
                generateRandom();
            }
        }
    }
}

dots[]3 つの一意の乱数を格納しようとしている配列です。ところで、col*row == 25.

4

4 に答える 4

6

これは少し異なるアプローチです。これは、指定された値のセットを使用してArrayListを作成し、そのリストをシャッフルすることに依存しています。リストがシャッフルされると、シャッフルされたリストの最初の3つの要素に基づいて配列を作成できます。

public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>();
    for(int i = 0; i < 26; i++){
        list.add(i);
    }

    Collections.shuffle(list);
    Integer[] randomArray = list.subList(0, 3).toArray(new Integer[3]);

    for(Integer num:randomArray){
        System.out.println(num);
    }
}
于 2013-03-17T20:21:08.070 に答える
2
for(int j=0;j<3;j++)
    dots[j]=(int)(Math.random()*Integer.MAX_VALUE)%25+1;

とにかくあなたMath.randomは乱数なので、掛けてInteger.MAX_VALUEもランダム性には影響しません。また、コードが機能しない理由の説明が必要な場合は、数値が比較的小さい場合、たとえば の下で0.001、乗算時に int を取得することで 0 を取得するためです。

于 2013-03-17T20:33:13.513 に答える
0

これがアプローチです

public void generateRandom() {
    for(int j=0; j<3; j++) {
      boolean f;
      do { 
        dots[j] = (int) (Math.random()*(col*row)+1);
        f = false;
        for(int i=j-1; i>=0; i--) {
            if(dots[i]==dots[j]) {
              f = true;
              break;
            }
        }
        if (!f)
          System.out.println(dots[j]);
      } while (f);
   }
}

重複が見つからなくなるまで、番号の生成を繰り返します。

于 2013-03-17T20:22:13.387 に答える
0

generateRandom が自分自身を呼び出すたびに、現在の位置に新しい乱数を選択するのではなく、最初の乱数で最初からやり直します。

于 2013-03-17T20:16:06.050 に答える