LoginSignup
1
1

More than 5 years have passed since last update.

重複しない乱数配列(Java版/ArrayList使用版)

Last updated at Posted at 2015-09-26

ArrayList不使用版を作ったので、続いてArrayList使用版を作ってみました。
例によってまたRandomクラスの乱数生成器を使いました。

MakeRandomArray.java
import java.util.ArrayList;
import java.util.Random;
public class MakeRandomArray {
    public ArrayList<Integer> makeRandomArray(ArrayList<Integer> array, Random rand, int arraySize, int randMax, int randMin){
        for(int i = 1; i <= arraySize; i++){
            array.add(random(rand, randMax, randMin));
        }
        boolean isAllNoConflict = false;
        do{
            isAllNoConflict = true;
            for(int j = 0; j <= arraySize - 1; j++){
                for(int k = j + 1; k <= arraySize - 1; k++){
                    if(array.get(k) == array.get(j)){
                        array.set(k, random(rand, randMax, randMin));
                        isAllNoConflict = false;
                    }
                }
            }
        }while(!isAllNoConflict);
        return array;
    }
    private int random(Random rand, int max,int min){
        if(max < min) return rand.nextInt(min - max) + max;
        else return rand.nextInt(max - min) + min;
    }
}

使用例

Main.java
import java.util.Random;
public class Main {
    public static void main(String[] args){
        MakeRandomArray mkrandArr = new MakeRandomArray();
        ArrayList<Integer> arr = mkrandArr.makeRandomArray(new ArrayList<Integer>(), new Random(), 10, 100, 1);
        for(int x = 0; x <= 9; x++) System.out.println(arr.get(x));

    }
}

別に行数変わんないのがね…。
これ作ってる時、そのことに気づいてすごく虚しかったです。
あ…そうだ。今回は1回しかmakeRandomArray呼んでないから引数にnew書いてますが、何回も呼ぶ場合は変数作ったほうがいいですからね。資源と労力は有効的に使いましょう。
ちなみにArrayList不使用版もそうですからね。

追記1

書いてから1年1ヶ月経ってますが、改良しました。たぶんこっちのほうが処理は速く、軽いです。

MakeRandArray.java
import java.util.ArrayList;
import java.util.Random;
public class MakeRandomArray {
    public ArrayList<Integer> makeRandomArray(int arraySize, int randMax, int randMin) {
        if (randMax < randMin) return this.makeRandomArray(arraySize, randMin, randMax);
        ArrayList<Integer> arr = new ArrayList<Integer>(randMax - randMin);
        for (int i = randMin; i <= randMax; i++) arr.add(i);
        Collections.shuffle(arr);
        return new ArrayList<Integer>(arr.subList(0, arraySize));
    }
}

mainメソッドは同じで大丈夫です。

追記2

なんか初歩的な書き間違いしてましたので修正してくださった方がいたのでそれを適用しました

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1