从枚举中选择一个随机值?
如果我有一个像这样的枚举:
public enum Letter {
A,
B,
C,
//...
}
随机选择一个的最佳方法是什么?它不需要是生产质量防弹的,但相当均匀的分布会很好。
我可以做这样的事情
private Letter randomLetter() {
int pick = new Random().nextInt(Letter.values().length);
return Letter.values()[pick];
}
但是有更好的方法吗?我感觉这个问题以前就已经解决了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
我唯一建议的是缓存
values()
的结果,因为每个调用都会复制一个数组。另外,不要每次都创建一个Random
。保留一个。除此之外,你所做的一切都很好。所以:The only thing I would suggest is caching the result of
values()
because each call copies an array. Also, don't create aRandom
every time. Keep one. Other than that what you're doing is fine. So:所有随机枚举都需要一个方法:
您将使用哪个方法:
我也更喜欢使用 SecureRandom 为:
A single method is all you need for all your random enums:
Which you'll use:
I also prefer to use SecureRandom as:
单线
Single line
结合 cletus 和 的建议helios,
编辑:哎呀,我忘记了有界类型参数,
>
。Combining the suggestions of cletus and helios,
Edit: Oops, I forgot the bounded type parameter,
<E extends Enum<E>>
.简单的 Kotlin 解决方案
random()
是基本 Kotlin 中包含在Collection
对象上的默认扩展函数。 Kotlin 文档链接如果您想简化它使用扩展函数,请尝试以下操作:
使其在枚举类上保持静态。确保在枚举文件中导入
my.package.random
如果您需要从枚举实例执行此操作,请尝试此扩展
Simple Kotlin Solution
random()
is a default extension function included in base Kotlin on theCollection
object. Kotlin Documentation LinkIf you'd like to simplify it with an extension function, try this:
To make it static on your enum class. Make sure to import
my.package.random
in your enum fileIf you need to do it from an instance of the enum, try this extension
同意 Stphen C 和 Stphen C 的观点。太阳神。从 Enum 中获取随机元素的更好方法是:
Agree with Stphen C & helios. Better way to fetch random element from Enum is:
最简单的方法可能是使用一个函数从数组中选择一个随机值。这更通用,并且调用起来更简单。
像这样调用:
It's probably easiest to have a function to pick a random value from an array. This is more generic, and is straightforward to call.
Call like so:
这是使用随机播放和流的版本
Here a version that uses shuffle and streams
这可能是实现您的目标的最简洁的方法。您所需要做的就是调用
Letter.getRandom()
,您将获得一个随机枚举字母。This is probably the most concise way of achieving your goal.All you need to do is to call
Letter.getRandom()
and you will get a random enum letter.如果您这样做是为了测试,您可以使用 Quickcheck (这是我一直在研究的 Java 端口)。
它支持所有原始类型、类型组合、集合、不同的分布函数、边界等。它支持执行多个值的运行程序:
Quickcheck 的优点是您可以基于 规范,其中普通 TDD 适用于场景。
If you do this for testing you could use Quickcheck (this is a Java port I've been working on).
It supports all primitive types, type composition, collections, different distribution functions, bounds etc. It has support for runners executing multiple values:
The advantage of Quickcheck is that you can define tests based on a specification where plain TDD works with scenarios.
我想这个单行返回方法足够有效,可以用于这样一个简单的工作:
I guess that this single-line-return method is efficient enough to be used in such a simple job:
在枚举上实现随机函数更容易。
然后你从你需要的班级中调用它,如下所示
It´s eaiser to implement an random function on the enum.
and then you call it from the class you need it like this
我会用这个:
I would use this:
枚举形状颜色{
蓝色的,
黄色的,
红色的,
绿色的,
白色的,
}
enum ShapeColor {
Blue,
Yellow,
Red,
Green,
White,
}