java实现大转盘抽奖的简单思路

大转盘抽奖


近期碰到的一个需求,实现一个类似大转盘抽奖的功能,需自定义奖项,各奖项中奖概率,当日抽奖最大次数,抽奖成本等。分享一个简单的java代码的实现的思路,有不足之处感谢各位指正。


设计思路

1.奖品概率

每个奖品的中奖概率各自独立,不必考虑概率总和是否等于1,即:A奖品的概率为100%,B奖品的概率80%的设置方式可以成立;

2.抽奖方式

  • 取出奖品列表(按照中奖概率大小倒序排列)
  • 通过java的Random()方法生成一个0-1的随机数,与设置好的奖品概率循环比较
  • 若随机数小于概率值,则抽中该奖项
  • 换句话说就是按照随机出的数字,概率由小到大,依次中奖

例如:A奖项概率100%,B奖项概率30%,C奖项概率1%,用户点击抽奖,随机数为0.2,此时,先比较C奖,(0.2<0.01)=false,则进入下一个奖项判断,(0.2<0.3)=true 则判断用户中奖B,跳出循环;

3. 奖品处理

一般来说,奖品设置不外乎一下几种类型:

  • 账户余额奖励;
  • 现金奖励();
  • 积分奖励;
  • 虚拟物品奖励(道具,会员等均归为此类)
  • 实物奖励(贵重物品,或需要物流的商品等)
    于是,这里推荐写一个”中奖处理器”工厂类,用不同的实现类来分别实现不同类型的奖品的中奖处理逻辑

4. 其他

一些不重要,但必须的注意事项,例如抽奖成本的维护,登陆验证,账户余额判断,根据项目需求而定。

核心代码

1. 奖项设置(大多简单的CUID操作,若项目中关系复杂请妥善思考关联关系,此处不做赘述)

2. 生成随机数(此处为了数据处理方便*100)

        Random randomTool = new Random();
        Double userSelect = randomTool.nextDouble()*100;
        Award award = awardManager.duageAward(userSelect);

3. duageAward方法用很简单的方法来,用来比较概率与随机数大小来判断中奖

        for (Award award : awardList) {
            if(userSelect < award.getProbability()){
                return award;
            }
        }

4. 奖品发放处理

  • 奖品发放工厂类

    public final  class SendAwardProcessorFactory {
        public static ISendAwardProcessor getProcessor(String awardType){
            if("valuables".equals(awardType)){//贵重物品类奖品流程
                return SpringContextHolder.getBean("awardForValuablesProcessor");
            }
            return null;
        }
    }
    通过一个awardType的参数来判断奖品类型,并创建一个处理方式的实例,每一个Processor都是一个处理接口,通过实现类来最终处理奖品发放业务
    

这里只提供一个笔者采用的思路,作为笔记与交流,有更好的处理方式欢迎指正。

猜你喜欢

转载自blog.csdn.net/yyzp1993/article/details/73929114