import java.util.*;
import java.util.stream.Collectors;
/**
* @Desc 权重算法
*/
public class WeightAlgorithm {
public static void main(String[] args) {
// 初始化奖品权重和数量
List<Prize> prizes = new ArrayList<>();
Random randomPrize = new Random();
String prizeId1 = String.valueOf(UUID.randomUUID()).toLowerCase().replaceAll("-", "");
int randomPrizeNum1 = randomPrize.nextInt(1000);
prizes.add(new Prize(prizeId1, "一等奖", 1, randomPrizeNum1));
String prizeId2 = String.valueOf(UUID.randomUUID()).toLowerCase().replaceAll("-", "");
int randomPrizeNum2 = randomPrize.nextInt(1000);
prizes.add(new Prize(prizeId2, "二等奖", 2, randomPrizeNum2));
String prizeId3 = String.valueOf(UUID.randomUUID()).toLowerCase().replaceAll("-", "");
int randomPrizeNum3 = randomPrize.nextInt(1000);
prizes.add(new Prize(prizeId3, "三等奖", 15, randomPrizeNum3));
String prizeId4 = String.valueOf(UUID.randomUUID()).toLowerCase().replaceAll("-", "");
int randomPrizeNum4 = randomPrize.nextInt(1000);
prizes.add(new Prize(prizeId4, "四等奖", 4, randomPrizeNum4));
String prizeId5 = String.valueOf(UUID.randomUUID()).toLowerCase().replaceAll("-", "");
int randomPrizeNum5 = randomPrize.nextInt(1000);
prizes.add(new Prize(prizeId5, "五等奖", 5, randomPrizeNum5));
// 抽奖池
List<Prize> resultList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
Prize prize = initWeight(prizes);
resultList.add(prize);
}
// 统计生成个数
Map<String, Integer> maps = new HashMap<>((int) (5/0.75+1));
resultList.stream().forEach(prize -> {
if(null != prize && null != prize.getPrizeId() && !(prize.getPrizeId()).equals("")){
String prizeId = prize.getPrizeId();
Integer prizeWeightCount = null != maps.get(prizeId) ? maps.get(prizeId) : 0;
if(prizeWeightCount > 0){
maps.put(prizeId, prizeWeightCount + 1);
}else{
maps.put(prizeId, 1);
}
}
});
System.out.println(maps);
}
// 权重计算
public static Prize initWeight(List<Prize> prizes){
int size = prizes.size();
// 总权重计算
int weightValues = prizes.stream().mapToInt(Prize::getWeightValue).sum();
// 获取总的概率区间中的随机数
Random random = new Random();
int randomWeight = random.nextInt(weightValues);
Prize resultPrize = null;
for (int i = 0; i < size; i++) {
Prize prize = prizes.get(i);
int weightValue = prize.getWeightValue();
if((randomWeight -= weightValue) <= 0){
resultPrize = prize;
break;
}
}
return resultPrize;
}
}
/**
* 奖品信息
*/
class Prize{
/** 奖品ID */
private String prizeId;
/** 奖品名称 */
private String prizeName;
/** 权重值 */
private int weightValue;
/** 奖品数量 */
private int prizeNum;
private Prize() {}
public Prize(String prizeId, String prizeName, int weightValue, int prizeNum) {
this.prizeId = prizeId;
this.prizeName = prizeName;
this.weightValue = weightValue;
this.prizeNum = prizeNum;
}
public String getPrizeId() {
return prizeId;
}
public void setPrizeId(String prizeId) {
this.prizeId = prizeId;
}
public String getPrizeName() {
return prizeName;
}
public void setPrizeName(String prizeName) {
this.prizeName = prizeName;
}
public int getWeightValue() {
return weightValue;
}
public void setWeightValue(int weightValue) {
this.weightValue = weightValue;
}
public int getPrizeNum() {
return prizeNum;
}
public void setPrizeNum(int prizeNum) {
this.prizeNum = prizeNum;
}
@Override
public String toString() {
return "Prize{" +
"prizeId='" + prizeId + '\'' +
", prizeName='" + prizeName + '\'' +
", weightValue=" + weightValue +
", prizeNum=" + prizeNum +
'}';
}
}
权重算法
最新推荐文章于 2023-12-30 22:47:19 发布