权重算法

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 +
                '}';
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值