如果我有一个这样的enum:

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

随机挑选一个的最佳方法是什么?它不需要是生产质量的防弹,但一个相当均匀的分布会很好。

我可以这样做

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

但是有没有更好的办法呢?我觉得这个问题之前已经解决了。


当前回答

如果你这样做是为了测试,你可以使用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与场景一起工作。

其他回答

如果你这样做是为了测试,你可以使用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与场景一起工作。

结合cletus和helios的建议,

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>>。

让函数从数组中随机选取一个值可能是最简单的。这是更通用的,并且调用起来很简单。

<T> T randomValue(T[] values) {
    return values[mRandom.nextInt(values.length)];
}

像这样叫:

MyEnum value = randomValue(MyEnum.values());

enum形状颜色{ 蓝色, 黄色的, 红色, 绿色, 白色 }

    Random random=new Random();
    ShapeColor[] values=ShapeColor.values();
    int size=values.length;
    return values[random.nextInt(size)];

一行

return Letter.values()[new Random().nextInt(Letter.values().length)];