내가 이와 같은 열거 형을 가지고 있다면 :
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));
}
}
답변
단일 임의의 열거 형에 필요한 모든 방법은 다음과 같습니다.
public static <T extends Enum<?>> T randomEnum(Class<T> clazz){
int x = random.nextInt(clazz.getEnumConstants().length);
return clazz.getEnumConstants()[x];
}
사용할 것 :
randomEnum(MyEnum.class);
또한 SecureRandom 을 다음과 같이 사용하는 것을 선호합니다 .
private static final SecureRandom random = new SecureRandom();
답변
import java.util.Random;
public class EnumTest {
private enum Season { WINTER, SPRING, SUMMER, FALL }
private static final RandomEnum<Season> r =
new RandomEnum<Season>(Season.class);
public static void main(String[] args) {
System.out.println(r.random());
}
private static class RandomEnum<E extends Enum<E>> {
private static final Random RND = new Random();
private final E[] values;
public RandomEnum(Class<E> token) {
values = token.getEnumConstants();
}
public E random() {
return values[RND.nextInt(values.length)];
}
}
}
편집 : 죄송합니다 <E extends Enum<E>>
. 경계 유형 매개 변수를 잊었습니다 .
답변
한 줄
return Letter.values()[new Random().nextInt(Letter.values().length)];
답변
Stphen C & helios에 동의하십시오. Enum에서 임의의 요소를 가져 오는 더 좋은 방법은 다음과 같습니다.
public enum Letter {
A,
B,
C,
//...
private static final Letter[] VALUES = values();
private static final int SIZE = VALUES.length;
private static final Random RANDOM = new Random();
public static Letter getRandomLetter() {
return VALUES[RANDOM.nextInt(SIZE)];
}
}
답변
Letter lettre = Letter.values()[(int)(Math.random()*Letter.values().length)];
답변
이것은 아마도 목표를 달성하는 가장 간결한 방법 일 것입니다 Letter.getRandom()
.
public enum Letter {
A,
B,
C,
//...
public static Letter getRandom() {
return values()[(int) (Math.random() * values().length)];
}
}