If I have an enum like this:
public enum Letter { A, B, C, //... }
What is the best way to pick one randomly? It doesn’t need to be production quality bulletproof, but a fairly even distribution would be nice.
I could do something like this
private Letter randomLetter() { int pick = new Random().nextInt(Letter.values().length); return Letter.values()[pick]; }
But is there a better way? I feel like this is something that’s been solved before.
Advertisement
Answer
The only thing I would suggest is caching the result of values()
because each call copies an array. Also, don’t create a Random
every time. Keep one. Other than that what you’re doing is fine. So:
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)); } }