从枚举中选择一个随机值?

新手上路,请多包涵

如果我有这样的枚举:

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

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

我可以做这样的事情

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

但是有更好的方法吗?我觉得这是以前已经解决的问题。

原文由 Nick Heiner 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 423
2 个回答

我唯一建议的是缓存 values() 的结果,因为每次调用都会复制一个数组。另外,不要每次都创建 Random 。留一个。除此之外,你所做的一切都很好。所以:

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

原文由 cletus 发布,翻译遵循 CC BY-SA 2.5 许可协议

所有随机枚举只需要一个方法:

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

原文由 Eldelshell 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题