快生活 - 生活常识大全

积分转盘抽奖算法设计解析


  积分转盘抽奖很常见,那么如何合理设计抽奖次数、每次抽奖消耗积分达到运营目的?
  一、背景
  大家在各类产品中很常见积分转盘抽奖,比如天猫积分抽奖等、常见的积分抽奖都是奖品价值大小不等,中奖概率不等。
  二、随机概率抽奖算法
  抽奖主要有以下几种做法,我们不考虑纯前端控制的方法。采用客户端+服务端方式,这是比较科学的。
  以下说明两种常见的抽奖概率的算法:
  (1)随机抽奖概率算法设计
  奖项数组是一个二维数组,记录本次抽奖的奖项信息:
  假设产品有n项、分别是:平板电脑、数码相机、音箱设备、4G优盘.、10积分、下次没准就能中哦。
  id表示中奖等级,prize表示奖品,v表示中奖权重,v必须为整数,v可以为0意味着该奖项抽中的几率是0。
  假设数组中v的总和为Sv(基数越大越能体现概率的准确性),那么每个奖品中奖概率就是v/Sv=(v1+v2+…+Am)(假设总和为100,平板电脑的中奖概率为1,中奖概率为百分之一,如果总和为100,中奖概率为万分之一)。
  每次前端请求,后台循环奖项设置数组,通过概率计算获取抽奖的奖项,输出数据给前端页面 。
  经典的概率算法:
  预先设置一个数组,假设数组为:array(100,200,300,400)。
  开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内,如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。
  这样筛选到最终,总会有一个数满足要求。就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。
  这个算法简单,而且效率非常高。
  (2)根据概率和剩余奖品数量来分配一个空间,再在这个空间中取随机数,判断随机数落在哪个区块方法获得抽奖结果
  设置总的概率区间;
  存储每个奖品新的概率区间;
  遍历每个奖品,设置概率区间,总的概率区间为每个概率区间的总和;
  每个概率区间为奖品概率乘以1000(把三位小数转换为整),再乘以剩余奖品数量,获取总的概率区间中的随机数;
  判断取到的随机数在哪个奖品的概率区间中。
  eg.有5个奖品,分别是:苹果、香蕉、橙子、葡萄、柚子。
  中奖机率如下:苹果:10%;香蕉:5%;橙子:60%;葡萄:10%;柚子:15%。
  根据奖品个数和中奖机率定义一个奖品概率数组,总和为100,生成区间数组【0,10,15,75,85,100】,定义一个随机数,随机数落入哪个区间,就中哪个奖品。
  三、等概率抽奖具体案例
  因为之前这个项目RD没有给后台设置奖品时加概率的配置,所以整个抽奖体系只能靠控制奖品项、控制库存数量来控制抽奖结果,而且运营了一段数据,根据运营数据分析做出了一些调整,所以等概率中奖会说明的详细一些。
  (1)抽奖页面的原型设计
  (2)设置不同积分值
  项目上线后,运营上线了积分可兑换的奖品,不同产品对应不同积分值兑换,设置了转盘可中奖的不同积分值。
  但上线两周后,运营发现数据不是自己想要的,虽然拉新促活的目的达到了,用户抽奖参与度也很高,但因为每天设置的抽奖次数过多,每次抽奖消耗的积分过少,每个用户每日中奖的积分数量增长过高,奖品兑换率过高。
  于是有了以下思考:应该设置用户每日抽奖几次、每次抽奖消耗多少积分才能合理达到运营想要效果。
  (3)在此我们假设所有的奖项都是积分数值
  讨论的前提是当前项目中每个奖品的中奖概率相等的情况,设奖品有m项、每项积分数分别为A1、A2、…、Am。
  每日可抽奖次数为n,每次抽奖消耗的积分为a,根据数学知识我们知道抽奖次数样本足够大时,抽奖几率应该趋近于相等。所以每轮抽奖(n次为一轮)可获得的积分数:Sn=(A1+A2+…+Am)-n*a
  【所有奖品抽到一次获得的总和-抽奖n次消耗的积分数】
  显然易见:若想用户抽奖积分为负增长,只需Sn&lt;0即可。若想用户抽奖积分为正增长,则只需sn&gt;0即可当每天可抽奖n次时,每天可获得的积分和平均值=Sn*n/m。<!--0即可。若想用户抽奖积分为正增长,则只需sn-->
  活动的最终目的还是促活、吸引更多的人来参与活动兑换奖品。那么假设兑换的奖品所需积分数为Y,想要用户兑换一个奖品的日活天数为d,使Y/d=(A1+A2+…+Am)*n/m即可。
  【每个奖品需要的分数/想要用户获得的天数=用户每天可获得积分数量】
  Y可根据奖品的平均积分数或最小积分数来计算,以此达到运营拉新促活的目的。
  四、总结
  以上是最近手头一个项目的经验及相关思考,积分转盘抽奖虽然常见,但是真正做起来需要考虑的点也很多,比如为了灵活运营,抽奖次数和消耗的积分后台可做成可配等等。
  每一个看似常见的功能都要自己亲自去设计,去跟进开发测试,才会有新的理解和收获。
  以上,一点经验分享,欢迎大家一起交流,多多指点。
网站目录投稿:凌玉