java简单的抽奖工具类(含测试方法)

发布时间:2024年01月22日

文章目录

结果

在这里插入图片描述

代码

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;

import java.util.ArrayList;
import java.util.List;

/**
 *
 */
public class LotteryUtils {

    public static void main(String[] args) throws InterruptedException {
        List<Prize> list = new ArrayList<>();

        list.add(new Prize(1L, "一等奖", 5));
        list.add(new Prize(2L, "二等奖", 15));
        list.add(new Prize(3L, "三等奖", 35));
        list.add(new Prize(4L, "谢谢回顾", 45)); // 权重越大,几率越高

        Integer t1 = 0;
        Integer t2 = 0;
        Integer t3 = 0;
        Integer t4 = 0;

        for (int i = 0; i < 100; i++) {
            Prize prize = weightFilter(list);
            if(prize.getId() == 1){
                t1++;
            }else if(prize.getId() == 2){
                t2++;
            }else if(prize.getId() == 3){
                t3++;
            }else{
                t4++;
            }
        }

        System.out.println("100万次抽结果如下:");
        System.out.println("一等奖:"+t1);
        System.out.println("二等奖:"+t2);
        System.out.println("三等奖:"+t3);
        System.out.println("谢谢回顾:"+t4);

    }




    /**
     * 从一组数据按照概率分布随机取出一个
     *
     * @param list列表
     * @return 随机生成的数据的Prize 
     */
    // 基于权重的随机算法
    public static Prize weightFilter(List<Prize> list) {
        // 获取list的权重总数
        long weight = list.stream().mapToLong(Prize::getWeight).sum();
        // 在总权重中抽取随机样本
        int random = (int) Math.floor(Math.random() * weight);
        for (int j = 0; j < list.size(); j++) {
            //如果随机样本 < 对象[j] 中指定的概率数值,则认为此次随机 命中在对象[j]上
            if (random - list.get(j).getWeight() < 0) {
                return list.get(j);
                //如果随机样本 > 对象[j] 中指定的概率数值 ,则认为此次随机 未命中在对象[j]上 ,刷新随机样本,继续下次循环
            } else {
                random -= list.get(j).getWeight();
            }
        }
        return null;
    }


    @Data
    @ToString
    @AllArgsConstructor
    public static class Prize {
        private Long id;
        private String prizeName;
        private Integer weight;
    }


}

文章来源:https://blog.csdn.net/u014131617/article/details/135744688
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。