抽奖算法的总结

这是个很简单的数学问题,在概率上叫做平均分布,计算机的随机种子函数一般都是提供平均分布的随机数,所以问题可以直接这样解决。
1定义一个0-99的随机种子 R
2划分你的5个奖区范围
a 0-1
b 1-1
c 1-3
d 3-6
e 6-99

随机种子R做在哪个范围就是哪个中奖了哦!简单吧?

最近一直在做抽奖活动,看用户对积分抽奖的反馈不是很好,其实我们积分系统的抽奖是逢几中奖滴,中不中奖,这个就看人品了。如果运气好的话,100个你认识人陪着你一起点,那就是100/100中奖。其实中奖的算法没啥,可以包括按概率和逢几中奖。
按概率的这个适合是虚拟的奖品,因为这个出的几率比较大。按逢几中奖,出奖的几率小,适合实物奖。
概率算法:

private static boolean isPrize(int per){
// 产生1至100之间的一个随机数
int random = (int)((Math.random()*100)+1);
return random=per;
}




2.根据奖品的过期日期来计算它当前时间的中奖率,当时间逐渐接近奖品过期时间时,中奖概率会逐渐发生变化,如果设为1表示线性衰减,2为平方衰减,以此类推。(这个是原先我们组的牛人写的,不过现在暂时都不用了,其实这个也适合实物奖)

private LotteryTool(double probability, long expireTime, int reduce) {
this.lumga = 0.001;
this.boundary = 1000;
this.middle = findMiddle();
this.factor = (double) System.currentTimeMillis() / expireTime;
this.probability = probability * Math.pow(factor, reduce);
// this.lumga = this.lumga * Math.pow(factor,reduce);
this.rand = new Random(System.currentTimeMillis());
}
public static LotteryTool getInstance(double probability, long expireTime,int reduce) {
return new LotteryTool(probability, expireTime, reduce);
}
public boolean isLucky(long expected) {
long token = generateLong();
expected = expected % (int) (1 / probability);
if (expected == token) {
return true;
}
return false;
}
private long generateLong() {
return (rand.nextLong() % (int) (1 / probability));
}
// percentage为概率比例
// endtime 奖品结束时间
// 比如1.2%,则basePercent=100,percentage=1.2
public static boolean getLottory(float probability,Date endtime)throws Exception{
Random r = new Random(System.currentTimeMillis());
LotteryTool tool = LotteryTool.getInstance(probability ,endtime.getTime(),1);
return tool.isLucky(r.nextLong());
}
逢几中奖算法(分几种):
1.以积分系统来说:

这个是计算用户点击某种奖品的次数,如果某种奖品是逢1000中奖,那如果一个用户点击这个奖品达到1000的倍数就算中奖。
但是积分系统的奖品都是逢10000中奖的,所以很多用户都反映不中奖,这个……
2.以目前的几个抽奖活动来说:
每天固定出多少奖品,这样的活动可以根据用户的参与度,适当的增加用户中奖率。
2.1根据每天出奖品的数,随机算出奖品中奖的次数,当用户达到该次数,用户中奖
2.2根据每天出奖品的数,随机算出奖品中奖的时间,当用户在该时间抽奖,用户中奖。
2.3取出一部分用户名单,抽取谁中奖,这个适合活动后抽奖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值