2019独角兽企业重金招聘Python工程师标准>>>
在所有活动总,抽奖活动占的比例是非常大的,现对已开发过的抽奖活动进行一个总结分析及评比思考
抽奖活动在整理上可以分为以下几种类型:
- 不限制人数,不设置奖品数量上限,只设置中奖概率
- 不限制人数,设置奖品数量上限,设置中奖概率
- 不限制人数,设置部分奖品数量上限部分没有上线,设置中奖概率
- 限制人数,人人中奖,设置中奖概率
- 限制人数,设置奖品数量上限,设置中奖概率
- 限制人数,设置部分奖品数量部分不设置数量上限,设置中奖概率
先解决概率设置问题
在整个抽奖程序中,概率的设置是至关重要的,那么设置概率有哪些方法呢
- 方法1:通过随机数获取概率,使用到的PHP函数有: rand 这种方法是不能控制中奖概率的,也就是随机的概率
- 方法2:通过事先设置好的中奖概率数组来随机从数组中抽取一个值来作为获得的奖品等级,使用到的PHP函数有: array_rand array_merge array_fill 这种方法是可以控制中奖的概率,但是每一次的中奖概率都是同一个几率的
- 方法3:通过网络上的经典算法来实现中奖概率
- 参考文章: php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
再解决奖品数量的问题
每一次中奖后,在有数量限制的奖品中都需要减少,这种数量的减少就需要写入缓存或者数据库中了
一旦奖品数量为0就需要降级处理或者设置为必中的奖品或者设置为未中奖
当然,每一个中奖记录我们都需要保存到数据库中
举例说明
不限制人数,不设置奖品数量上限,只设置中奖概率
这种一般是虚拟类奖品的赠送,例如红包、积分等
奖品 | 数量 | 概率 | 获奖等级 |
---|---|---|---|
5元现金红包 | 不限制 | 40% | 4 |
10元现金红包 | 不限制 | 30% | 3 |
20元现金红包 | 不限制 | 20% | 2 |
50元现金红包 | 不限制 | 10% | 1 |
这种抽奖活动的实现就可以使用方法2和方法3啦,先获取概率,再记录并写入数据库,返回中奖结果
不限制人数,设置奖品数量上限,设置中奖概率
这种一般是实物类的奖品抽奖,会有未中奖选项存在的
奖品 | 数量 | 概率 | 获奖等级 |
---|---|---|---|
小米充电器 | 40 | 40% | 4 |
电烤箱 | 30 | 30% | 3 |
ipad | 20 | 20% | 2 |
iphone | 10 | 10% | 1 |
这种抽奖活动的实现思路就是在奖品出来后判断一次奖品是否发送完成,如果发送完成则提示未中奖
不限制人数,设置部分奖品数量上限部分没有上线,设置中奖概率
这种一般是有实物和虚拟结合的,也有是纯实物的,只是有一款实物的成本很低很低
奖品 | 数量 | 概率 | 获奖等级 |
---|---|---|---|
5元现金红包 | 不限制 | 40% | 4 |
电烤箱 | 30 | 30% | 3 |
ipad | 20 | 20% | 2 |
iphone | 10 | 10% | 1 |
这种抽奖活动的实现思路就是在奖品出来后判断一次奖品是否发送完成,如果发送完成则将中奖的等级更新为必中的奖品即可
限制人数,人人中奖,设置中奖概率
这种一般是现场活动下的抽奖游戏,人人参与人人中奖,数量不多
奖品 | 数量 | 概率 | 获奖等级 |
---|---|---|---|
小米充电器 | 不限制 | 40% | 4 |
电烤箱 | 30 | 30% | 3 |
ipad | 20 | 20% | 2 |
iphone | 10 | 10% | 1 |
这种活动的实现思路是: 一次将奖品写入到缓存或者数据库中,每次读取一条数据并更改状态
限制人数,设置奖品数量上限,设置中奖概率
这种一般是出现在现场和线上的指定人数参与的抽奖活动
奖品 | 数量 | 概率 | 获奖等级 |
---|---|---|---|
小米充电器 | 不限制 | 40% | 4 |
电烤箱 | 30 | 30% | 3 |
ipad | 20 | 20% | 2 |
iphone | 10 | 10% | 1 |
这种活动的实现思路是: 一次将奖品写入到缓存或者数据库中,每次读取一条数据并更改状态,并且要写入未中奖的数据
限制人数,设置部分奖品数量部分不设置数量上限,设置中奖概率
这种就相当于是必中啦,只是必中的一定是不设置上限的奖品
奖品 | 数量 | 概率 | 获奖等级 |
---|---|---|---|
小米充电器 | 不限制 | 40% | 4 |
电烤箱 | 30 | 30% | 3 |
ipad | 20 | 20% | 2 |
iphone | 10 | 10% | 1 |
这种活动的实现思路是: 在用户抽奖时先判断是否是否超过人数,再根据中奖概率来匹配,如果奖品已经发送完,则强制更新为必中奖项即可
注意:
- 在转盘的开发过程中,要设置一个timeout值,如果请求没有及时返回要要求前端设置一个未中奖的值,最好是再向后台回调请求一次,来解决后端响应缓慢的问题
- 指定时间点中奖的抽奖活动其实就是先判断时间点和奖品是否已经发送出去,再来强制性的更改中奖的奖品等级,并写入到数据库