【Java】 特定の数値を除いた乱数を取得する方法


9/13 更新

以前書いたコードを改善しました。改善点としては
- ListではなくSetを使用し、リトライ回数を減らしたこと
- 除外したい数値をString型ではなくInterger型にしたこと

main.java
import java.util.Random;
import java.util.HashSet;

public class Main {

    public static void main(String[] args) {
        Random rand = new Random();
        int i;
        // 除外したい数値を格納する
        Set exSet = new HashSet();
        exList.add(2);
        exList.add(5);
        exList.add(8);

        do {
            i = Interger.valueOf(rand.nextInt(10)+1); // 1~10までの乱数を生成し文字列に変換
        } while (exSet.contains(i)); //除外リストのいずれかの数値と一致なら繰り返す
        System.out.println(i);
    }
}

こちらが改善前のコード

main.java
import java.util.ArrayList;
import java.util.Random;

public class Main {

    public static void main(String[] args) {
        Random rand = new Random();
        String i;
        // 除外したい数値を格納する
        List<String> exList = new ArrayList<String>();
        exList.add("2");
        exList.add("5");
        exList.add("8");

        do {
            i = String.valueOf(rand.nextInt(10)+1); // 1~10までの乱数を生成し文字列に変換
        } while (exList.contains(i)); //除外リストのいずれかの数値と一致なら繰り返す
        System.out.println(i);
    }
}

海外でのQAサイトで見つけた特定の数値を除いた乱数を除外する方法も見つけたが
参考までに載せておきます。

public int getRandomWithExclusion(Random rnd, int start, int end, int... exclude) {
    int random = start + rnd.nextInt(end - start + 1 - exclude.length);
    for (int ex : exclude) {
        if (random < ex) {
            break;
        }
        random++;
    }
    return random;
}
main.java
int[] ex = { 2, 5, 6 };
val = getRandomWithExclusion(rnd, 1, 10, ex)
// 5,6,7の乱数を発生させた場合、7の値を取得するため、7のみ発生頻度が高くなってしまう