如果我有一个这样的enum:

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

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

我可以这样做

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

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


当前回答

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

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

像这样叫:

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

其他回答

同意stephen 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)];
  }
}

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

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

}

这可能是实现目标最简洁的方式。你所需要做的就是调用letter. getrandom(),你会得到一个随机枚举字母。

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

    public static Letter getRandom() {
        return values()[(int) (Math.random() * values().length)];
    }
}

一个方法就是你需要的所有随机枚举:

    public static <T extends Enum<?>> T randomEnum(Class<T> clazz){
        int x = random.nextInt(clazz.getEnumConstants().length);
        return clazz.getEnumConstants()[x];
    }

你会用到:

randomEnum(MyEnum.class);

我也更喜欢使用securerrandom:

private static final SecureRandom random = new SecureRandom();