Intellipaat Back

Explore Courses Blog Tutorials Interview Questions
0 votes
5 views
in Java by (10.2k points)

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.

2 Answers

0 votes
by (46k points)

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));

  }

}

0 votes
by (1.7k points)

Your approach is actually quite the standard and efficient method to select a random enum value. Using `Random` with `Letter.values()` is quite intuitive; you will get an evenly distributed result. However, there are two slight improvements you can make,

1. Reuse your `Random` instance; you do not need one every time-you are creating a new object that's going to do absolutely nothing, which is always inefficient. Create a `Random` instance once and reuse it.

2. Simplify the Code: Your code is very close to optimal as it is, but here is the cleaned up version:

import java.util.Random;

public enum Letter {

A, B, C; // Add more as needed

private static final Random RANDOM = new Random();

public static Letter getRandomLetter() {

Letter[] values = values();

return values[RANDOM.nextInt(values.length)];

}

}.

- Static Method: There is a static method called `getRandomLetter()` inside the enum itself, which makes it convenient to use: `Letter.getRandomLetter()`.

This is efficient and evenly distributed, simple.

Related questions

0 votes
1 answer
0 votes
1 answer
0 votes
1 answer
asked Oct 17, 2019 in Java by Anvi (10.2k points)
0 votes
1 answer
0 votes
1 answer

31k questions

32.8k answers

501 comments

693 users

Browse Categories

...