如果我有一个这样的enum:

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

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

我可以这样做

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

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


当前回答

简单的Kotlin解决方案

MyEnum.values().random()

random()是Collection对象上包含在基本Kotlin中的默认扩展函数。Kotlin文档链接

如果你想用扩展函数来简化它,试试这个:

inline fun <reified T : Enum<T>> random(): T = enumValues<T>().random()

// Then call
random<MyEnum>()

使它在枚举类上是静态的。确保在枚举文件中导入my.package.random

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

其他回答

Letter lettre = Letter.values()[(int)(Math.random()*Letter.values().length)];

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

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

这里有一个使用shuffle和streams的版本

List<Direction> letters = Arrays.asList(Direction.values());
Collections.shuffle(letters);
return letters.stream().findFirst().get();

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

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

像这样叫:

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

在枚举上实现一个随机函数更容易。

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