Java 实现抽奖

本文介绍了如何使用Java设计一个公平的抽奖系统,包括奖品设计、概率分配和抽奖逻辑实现。利用TreeMap和ThreadLocalRandom生成随机数,通过tailMap方法确保每个奖品的中奖概率,即使有奖品库存为0,也能保持总概率不变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.youkuaiyun.com/liujun03/article/details/80708293

设计思路

1.奖品设计

​ 1️⃣可乐 2️⃣雪碧3️⃣辣条4️⃣咖啡5️⃣现金五毛6️⃣现金一元7️⃣谢谢参与

2.奖品概率问题

​ 首先设计的这个抽奖转盘是必中奖的,其中谢谢参与也是个奖品,而且这个的中奖概率可以设计为最大的。

总概率为100,也就是说这些奖品的中奖概率加起来必须等于100(也可以将总概率设计为1)。

​ 其次我们得考虑到有些奖品的库存为0的话(比如某个奖品被抽完了或者某个10000元现金奖品不想被人抽到),为了保证中奖的概率不变,我们可以将这些库存为0 的奖品的中奖概率叠加到某个奖品上去(比如谢谢参与=-=),这样就保证了总的概率不变的情况下,只自动叠加了某个奖品的中奖概率,而不会影响其余奖品的中奖概率。

3.抽奖实现问题

​ 奖品设计完了,概率也设计好了。那我们该如何实现抽奖的具体的逻辑呢??这里介绍几个小概念:

首先是TreeMap 的tailMap()方法 ==>

 public NavigableMap<K,V> tailMap(K fromKey, boolean inclusive) {
        return new AscendingSubMap<>(this,
                                     false, fromKey, inclusive,
                                     true,  null,    true);
    }
 
 

    tailMap(K fromKey, boolean inclusive)方法用于返回其键大于或等于fromKey的部分视图,其中参数inclusive是来控制是否返回键等于formKey的视图的,false表示不返回。

    其次是ThreadLocalRandom ==>

    ThreadLocalRandom.current().nextInt(100)
     
     

      在多线程环境下生成一个一定范围内的随机数。nextInt()的范围从0开始 不包括最大值。

      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值