重複しない乱数配列(Java版/ArrayList使用版)
ArrayList不使用版を作ったので、続いてArrayList使用版を作ってみました。
例によってまたRandomクラスの乱数生成器を使いました。
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;
}
}
使用例
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.javaimport 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
なんか初歩的な書き間違いしてましたので修正してくださった方がいたのでそれを適用しました
Author And Source
この問題について(重複しない乱数配列(Java版/ArrayList使用版)), 我々は、より多くの情報をここで見つけました https://qiita.com/AinoMegumi/items/d3db3cff4c57d2544201著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .