열거형에서 임의의 값을 선택하시겠습니까?
다음과 같은 열거형이 있는 경우:
public enum Letter {
A,
B,
C,
//...
}
무작위로 고르는 가장 좋은 방법은 무엇일까요?생산품질의 방탄은 필요 없지만, 균등한 분배가 좋습니다.
난 이런 걸 할 수 있어
private Letter randomLetter() {
int pick = new Random().nextInt(Letter.values().length);
return Letter.values()[pick];
}
하지만 더 좋은 방법은 없을까?이건 이미 해결된 문제인 것 같아요.
은 오직 그 입니다.values()
각 콜이 어레이를 복사하기 때문입니다.'아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 이런 것도 Random
keep . 하나 하나 가지세요.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ★★★★★★★★★★★★★★★★:
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));
}
}
모든 랜덤 에넘에 필요한 방법은 1개뿐입니다.
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();
한 줄
return Letter.values()[new Random().nextInt(Letter.values().length)];
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)];
}
}
}
, 매개 변수 Edit:를 . 반대, 경계형입니다.<E extends Enum<E>>
.
심플한 Kotlin 솔루션
MyEnum.values().random()
random()
는 기본 된 기본 입니다.Collection
물건.Kotlin 문서 링크
확장 기능으로 심플하게 하고 싶은 경우는, 다음과 같이 해 주세요.
inline fun <reified T : Enum<T>> random(): T = enumValues<T>().random()
// Then call
random<MyEnum>()
열거형 클래스에서 정적 상태로 만듭니다. 가져오세요.my.package.random
file ( in in in당당당당파일)
MyEnum.randomValue()
// Add this to your enum class
companion object {
fun randomValue(): MyEnum {
return random()
}
}
열거 인스턴스에서 수행해야 하는 경우 이 확장자를 사용해 보십시오.
inline fun <reified T : Enum<T>> T.random() = enumValues<T>().random()
// Then call
MyEnum.VALUE.random() // or myEnumVal.random()
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)];
배열에서 임의의 값을 선택하는 함수를 사용하는 것이 가장 쉽습니다.이것은 보다 범용적이고 호출이 간단합니다.
<T> T randomValue(T[] values) {
return values[mRandom.nextInt(values.length)];
}
다음과 같이 호출합니다.
MyEnum value = randomValue(MyEnum.values());
여기 셔플과 스트림을 사용하는 버전이 있습니다.
List<Direction> letters = Arrays.asList(Direction.values());
Collections.shuffle(letters);
return letters.stream().findFirst().get();
이것이 당신의 목표를 달성하는 가장 간결한 방법일 것입니다.만 하면 .Letter.getRandom()
을 사용법
public enum Letter {
A,
B,
C,
//...
public static Letter getRandom() {
return values()[(int) (Math.random() * values().length)];
}
}
테스트를 위해 이 작업을 수행하는 경우 Quickcheck를 사용할 수 있습니다(이것이 제가 작업하고 있는 Java 포트입니다).
import static net.java.quickcheck.generator.PrimitiveGeneratorSamples.*;
TimeUnit anyEnumValue = anyEnumValue(TimeUnit.class); //one value
모든 원시 유형, 유형 구성, 컬렉션, 다양한 배포 함수, 경계 등을 지원합니다.여러 값을 실행하는 러너를 지원합니다.
import static net.java.quickcheck.generator.PrimitiveGeneratorsIterables.*;
for(TimeUnit timeUnit : someEnumValues(TimeUnit.class)){
//..test multiple values
}
Quickcheck의 장점은 일반 TDD가 시나리오와 함께 작동하는 사양에 따라 테스트를 정의할 수 있다는 것입니다.
이 한 줄 리턴 방식은 다음과 같은 간단한 작업에 사용할 수 있을 만큼 효율적이라고 생각합니다.
public enum Day {
SUNDAY,
MONDAY,
THURSDAY,
WEDNESDAY,
TUESDAY,
FRIDAY;
public static Day getRandom() {
return values()[(int) (Math.random() * values().length)];
}
public static void main(String[] args) {
System.out.println(Day.getRandom());
}
}
열거형에서 랜덤 함수를 구현하는 것입니다.
public enum Via {
A, B;
public static Via viaAleatoria(){
Via[] vias = Via.values();
Random generator = new Random();
return vias[generator.nextInt(vias.length)];
}
}
수업시간에 전화해서 이렇게 부르면 돼
public class Guardia{
private Via viaActiva;
public Guardia(){
viaActiva = Via.viaAleatoria();
}
나는 이것을 사용한다:
private static Random random = new Random();
public Object getRandomFromEnum(Class<? extends Enum<?>> clazz) {
return clazz.values()[random.nextInt(clazz.values().length)];
}
Enum ShapeColor {파란색, 노란색, 빨간색, 녹색, 흰색, }
Random random=new Random();
ShapeColor[] values=ShapeColor.values();
int size=values.length;
return values[random.nextInt(size)];
public static Letter randomLetter() {
return List.of(values()).get(Random.randomInt(List.of(values()).size()));
}
언급URL : https://stackoverflow.com/questions/1972392/pick-a-random-value-from-an-enum
'programing' 카테고리의 다른 글
Linux에서 C 코드 내의 외부 프로그램을 인수로 실행하려면 어떻게 해야 합니까? (0) | 2022.08.03 |
---|---|
C 또는 C++에서 단일 인스턴스 응용 프로그램을 만드는 방법 (0) | 2022.08.03 |
ANSI C에서 NaN, -Infinity 및 +Infinity를 생성하는 방법 (0) | 2022.08.02 |
Vuetify 대화상자를 프로그래밍 방식으로 실행하고 응답을 기다리는 방법 (0) | 2022.08.02 |
Laravel 프로젝트의 Vue.use(VueResource) 문자열은 어디에 있습니까? (0) | 2022.08.02 |