1. ホーム
  2. java

[解決済み] enumからランダムな値を選ぶ?

2022-02-11 17:13:04

質問

このようなenumがあった場合。

public enum Letter {
    A,
    B,
    C,
    //...
}

ランダムに選ぶにはどうしたらいいのでしょうか?製品品質の弾丸である必要はありませんが、かなり均等な分布であればいいと思います。

こんなことができるんです

private Letter randomLetter() {
    int pick = new Random().nextInt(Letter.values().length);
    return Letter.values()[pick];
}

でも、もっといい方法はないのでしょうか?以前にも解決されたことがあるような気がするのですが。

どのように解決するのか?

の結果をキャッシュすることだけが、私の提案です。 values() なぜなら、呼び出しのたびに配列がコピーされるからです。また Random 毎回 一つにしておきましょう。それ以外は、あなたがやっていることは問題ありません。だから

public enum Letter {
  A,
  B,
  C,
  //...

  private static final List<Letter> VALUES =
    Collections.unmodifiableList(Arrays.asList(values()));
  private static final int SIZE = VALUES.size();
  private static final Random RANDOM = new Random();

  public static Letter randomLetter()  {
    return VALUES.get(RANDOM.nextInt(SIZE));
  }
}