非等概率抽奖算法
抽奖需求:
-
每日抽奖3次,第1次中奖率 小于 第2次中奖率 小于 第3次中奖率;
-
每日参与各次抽奖的人数不固定,奖品月投放总量固定;
-
用户中奖率按等级分层,高价值奖品让高等级用户抽中;
-
有的奖品只在固定时间段出现,有的奖品在某个时间段出现概率更高;
-
存在黑名单和白名单,名单上的用户一定中某类奖品或者一定不中某类奖品;
算法实现:
1.确定单日抽奖人次;
DAY1:预估参与抽奖人次为N1;DAY2:参与抽奖人次为N2=N0+N',其中N'为预估的增长量;DAY3:N3=N2+N‘’......如此迭代,第N天用户参与抽奖人次的预估Nn就可以根据前面N-1天参与抽奖的人次来估计,而且这个估计会越来越准确。
2.确定奖品总量和奖品池;
假设有A,B,C,D4类奖品,单日投放总量为M。用户中奖率=M/Nn
假定用户中奖率为0.8,那么用户进来抽奖,随机生成1到100的随机数中的一个;
时段1: 1到10为中A奖品,11到50中B奖品,51到60中C奖品,61到80中D奖品,81到100不中奖;
时段2:1到10中A奖品,11到20中B奖品,21到70中C奖品,71到80中D奖品,81到100不中奖;
这样就可以根据不同的时段,让不同奖品中奖率不同;
3.用户等级分层;
用户抽奖生成的随机数,假设为X。X乘以一个数,假设为L:用户为高等级用户,L<1;用户为低等级用户,小号用户,L>1;
4.各次抽奖中奖概率不同;
根据第3步中得到乘以L之后的随机数,再乘以一个数,假设为T。第一次抽奖,乘以T1;第二次抽奖,乘以T2;第三次抽奖,乘以T3;
最终用户进入奖池的随机数=X*L*T,根据抽奖时间段进入不同的奖池进行抽奖即可
注:白名单和黑名单用户另外单独判定;
原文地址http://offer1988.diandian.com/post/2012-09-28/40038409408