java 传入抽奖概率 0~100(包含小数)设计奖池,返回抽奖结果

72 篇文章 0 订阅

工具类拿去用吧

可以根据实际情况和需求进行修改



import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;

public class LuckyMachineUtil {

        private static List<Integer> stringT=new ArrayList<>();
        private static List<Integer> stringC=new ArrayList<>();
        /**
         * 根据传入的百分比将参数分组(初始化奖池),抽奖
         */
        public static  boolean  luckDraw(String percentage){
            //解析中奖概率
            boolean statDoubel=judgeDoubel(percentage);
            //判断能否将小数转换成整型
            boolean statInt=judgeInt(percentage);
            if(!statInt && !statDoubel){
                System.out.println("概率参数有问题,默认不中奖");
                return false;
            }
            if(statInt){
                stringT=new ArrayList<>();
                stringC=new ArrayList<>();
                BitSet bs = new BitSet(100);
                //生成中奖奖池
                for (int count = 0; count < Integer.valueOf(percentage);) {
                    int random = (int) (Math.random() * 100);
                    if (!bs.get(random)) {
                        bs.set(random);
                        stringT.add(random);
                        count++;
                    }
                }
                //生成不中奖奖池
                for (int count = 0; count < 100;count++) {
                    //输出不重复的随机数
                    //System.out.print(i + " ");
                    if(!stringT.contains(count)){
                        stringC.add(count);
                    }
                }
                //获取中奖随机数判断是否中奖
                int random = (int) (Math.random() * 100);
                boolean t =stringT.contains(random);
                boolean f =stringC.contains(random);
                System.out.println("中奖奖池"+stringT.toString());
                System.out.println("不中奖奖池"+stringC.toString());
                System.out.println("号码"+random);
                if (t==true && f==false){
                    return true;
                }else {
                    return false;
                }
            }else if(statDoubel){
                //将概率转换成小数
                Double jdoube=Double.valueOf(percentage);
                if(jdoube==0){
                    return false;
                }
                //获取小数位数
                int p= checkIsDoublePointTwo(jdoube);
                    stringT = new ArrayList<>();
                    stringC = new ArrayList<>();
                    BitSet bs = new BitSet(100 * (p * 100));
                    for (int count = 0; count < (p * 100); ) {
                        int random = (int) (Math.random() * 100 * (p * 100));
                        if (!bs.get(random)) {
                            bs.set(random);
                            stringT.add(random);
                            count++;
                        }
                    }

                    for (int count = 0; count < 100 * (p * 100);count++) {
                        //输出不重复的随机数
                        //System.out.print(i + " ");
                        if(!stringT.contains(count)) {
                            stringC.add(count);
                        }
                    }
                    //获取中奖随机数判断是否中奖
                    int random = (int) (Math.random() * 100 * (p * 100));
                    boolean t = stringT.contains(random);
                    boolean f = stringC.contains(random);
                System.out.println("中奖奖池"+stringT.toString());
                System.out.println("不中奖奖池"+stringC.toString());
                System.out.println("号码"+random);
                    if (t == true && f == false) {
                        return true;
                    } else {
                        return false;
                    }
            }

            return false;
        }


    /**
     * 尝试将doube转换成数字
     * @param doubelString
     * @return
     */
    public static boolean judgeDoubel(String doubelString){
            try {
                Double d=Double.valueOf(doubelString);
                return true;
            }catch (Exception e){
                e.printStackTrace();
                return false;
            }
        }

    /**
     * 尝试将doube转换成数字
     * @param doubelString
     * @return
     */
    public static boolean judgeInt(String doubelString){
        try {
            Integer d=Integer.valueOf(doubelString);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获取double的位数
     * @param param
     * @return
     */
    public static int checkIsDoublePointTwo(Double param) {
        if (param == null) {
            return 0;
        }
        BigDecimal bd = new BigDecimal(String.valueOf(param));
        String[] ss = bd.toString().split("\\.");
        if (ss.length <= 1){
            return 0;
        }
        return ss[1].length();
    }


    public static void main(String[] args) {
        System.out.println(luckDraw("0"));
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java概率抽奖工具类是一个用于进行概率抽奖操作的工具类。它包含了一个构造方法和一个核心抽奖方法。构造方法接收一个概率集合作为参数,而核心抽奖方法则会根据概率集合进行抽奖操作,并返回对应奖品的索引下标。\[1\] 在抽奖过程中,工具类会根据传入概率集合生成一个随机数,并根据随机数的值来确定抽中的奖品。具体来说,工具类会将概率集合中的每个概率值映射到一个区间范围内,然后生成一个0到最大区间值的随机数。根据随机数所在的区间范围,确定抽中的奖品。\[2\] 在实际的业务场景中,通常会使用权重来配置奖品的概率,而不是直接输入百分比。奖品的权重值可以大于等于0,而奖品的概率则等于奖品权重除以所有奖品权重的合计值。这样做的好处是不需要手动计算精确的概率百分比,并且可以避免总概率不等于100%的问题。\[3\] 以上就是关于Java概率抽奖工具类的简要介绍。 #### 引用[.reference_title] - *1* [java实现一个抽奖概率类](https://blog.csdn.net/fcytxdy/article/details/44408555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [使用 Java 实现指定概率抽奖](https://blog.csdn.net/Yan2heng/article/details/128370983)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值