一、背景:
奖项集合为items,每个奖项拥有自己的概率,根据其概率抽取奖项,并返回被抽中的奖项。
二、思想:
1、算法思想:
构造概率区间,如:A奖项概率为2,B奖项为4,C奖项为3,构造概率区间[0, 2, (2+4), (2+4+9)],即[0, 2, 6, 9],之后生成一个0到9的随机数,如3,3落到2到6的区间里,小于区间里第3个元素,取其下标2,对应抽中的就是奖项种类中下标为2的奖项,就是B。
2、优点:
效率较高,推荐。
三、代码:
public Comment randomGetItem(List<Item> items) {
if (CollectionUtils.isEmpty(items)) {
logger.warn("需抽取的奖项为空!");
return null;
}
// 构造概率区间
int total = 0;
int size = items.size();
int[] interval = new int[size];
for (int i = 0; i < size; i++) {
total += items.get(i).getPercent();
interval[i] = total;
}
// 生成随机数
int random = new Random().nextInt(total);
// 获取随机数所在位置,
int selected = -1;
for (int i = 0; i < size; i++) {
if (random < interval[i]) {
selected = i;
break;
}
}
if (selected == -1) {
return null;
}
return items.get(selected);
}