programing

열거형에서 임의의 값을 선택하시겠습니까?

goodcopy 2022. 8. 3. 21:23
반응형

열거형에서 임의의 값을 선택하시겠습니까?

다음과 같은 열거형이 있는 경우:

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

무작위로 고르는 가장 좋은 방법은 무엇일까요?생산품질의 방탄은 필요 없지만, 균등한 분배가 좋습니다.

난 이런 걸 할 수 있어

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

하지만 더 좋은 방법은 없을까?이건 이미 해결된 문제인 것 같아요.

은 오직 그 입니다.values()각 콜이 어레이를 복사하기 때문입니다.'아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 이런 것도 Randomkeep . 하나 하나 가지세요.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ★★★★★★★★★★★★★★★★:

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

반응형