重複なしのJava配列におけるランダムな値の生成

Java 配列で乱数を重複なく生成するには以下の方法があります。

  1. Java.util.Randomクラスを利用して乱数を生成し、その乱数をSetコレクションに格納します。Setコレクションは重複した要素を持たないため、生成された乱数は重複しないことが保証されます。その後、Setコレクションを配列に変換します。
import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class RandomArray {
    public static void main(String[] args) {
        int[] array = generateRandomArray(10, 1, 100);
        for (int num : array) {
            System.out.println(num);
        }
    }

    public static int[] generateRandomArray(int length, int min, int max) {
        if (length > (max - min + 1)) {
            throw new IllegalArgumentException("生成不了指定范围内的不重复随机数!");
        }
        
        Random random = new Random();
        Set<Integer> set = new HashSet<>();
        
        while (set.size() < length) {
            int randomNum = random.nextInt(max - min + 1) + min;
            set.add(randomNum);
        }
        
        int[] array = new int[length];
        int index = 0;
        for (int num : set) {
            array[index++] = num;
        }
        
        return array;
    }
}
  1. 別の方法として、Fisher-Yatesアルゴリズムを用いる方法が挙げられます。これは、配列内の要素の位置を入れ替えることで、重複のない乱数を生成する手法です。
import java.util.Random;

public class RandomArray {
    public static void main(String[] args) {
        int[] array = generateRandomArray(10, 1, 100);
        for (int num : array) {
            System.out.println(num);
        }
    }

    public static int[] generateRandomArray(int length, int min, int max) {
        if (length > (max - min + 1)) {
            throw new IllegalArgumentException("生成不了指定范围内的不重复随机数!");
        }
        
        int[] array = new int[length];
        Random random = new Random();
        
        for (int i = 0; i < length; i++) {
            int randomIndex = random.nextInt(max - min + 1 - i) + i;
            array[i] = randomIndex;
            
            int temp = array[i];
            array[i] = array[randomIndex];
            array[randomIndex] = temp;
        }
        
        for (int i = 0; i < length; i++) {
            array[i] = array[i] + min;
        }
        
        return array;
    }
}

乱数を生成して配列に入れる方法が2つあり、重複しない乱数を確保するために、一種はSet集合を用い、もう一種はFisher-Yatesアルゴリズムを利用している。それぞれのニーズによってどちらの方法を使用するかを選択すれば良い。

bannerAds