版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/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)</