我知道这里在stackoverflow中已经存在一个有关如何随机选择枚举的问题。在示例代码中,每个字母都有相同的被选择概率。但是,当不是每个枚举都具有相同的概率时,我将如何重写代码?例如:A的概率为50%,B的概率为30%,C的概率为15%,D的概率为5%。
public enum Letter {
A,
B,
C,
D;
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));
}
}
这是一种将每个枚举值与概率范围相关联,然后在该范围内拟合随机数以选择值的方法:
enum Letter {
A(0, 51), B(51, 81), C(81, 96), D(95, 101);
private int probStart;
private int probEnd;
private static final Random RANDOM = new Random();
Letter(int s, int e) {
this.probStart = s;
this.probEnd = e;
}
public static Letter randomLetter() {
int pick = RANDOM.nextInt(100);
return Arrays.stream(values())
.filter(v -> pick >= v.probStart && pick < v.probEnd)
.findAny()
.get();
}
}
当然,您可以选择将这些概率缓存在地图中,但是像上述那样的实现(基于百分比比例)似乎只是创建了一个太大的地图,以至于搜索是不希望的。
一些测试连续产生了以下100组选择:
{A=56, B=26, C=14, D=4}
{A=39, B=39, C=18, D=4}
{A=51, B=30, C=13, D=6}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句