抽奖算法:

package test;import java.util.List;public class PrizeMathRandom {/*** 根据Math.random()产生一个double型的随机数,判断每个奖品出现的概率* RegisteredMarketingCouponMapping该对象为抽奖活动与奖品挂关系表的实体* @param prizes* @return random:奖品列表prizes中的序列(prizes中的第random个就是抽中的奖品)*/public int getPrizeIndex(List<RegisteredMarketingCouponMapping> prizes) {
//        DecimalFormat df = new DecimalFormat("######0.00");  int random = -1;try{//计算总权重double sumWeight = 0;for(RegisteredMarketingCouponMapping p : prizes){//如果奖品的数量为0或者不出奖则置奖品的数量为0,让其无法抽中sumWeight += Double.parseDouble(p.getWinningRate())*(p.getCouponQty() == 0 || p.getCanAward().equals("0") ? 0 : 1);}if(sumWeight <= 0){System.out.println("老板破产了");return random;}//产生随机数,0-1之间的随机数double randomNumber = Math.random();//根据随机数在所有奖品分布的区域并确定所抽奖品double d1 = 0;double d2 = 0;          for(int i=0;i<prizes.size();i++){d2 += Double.parseDouble(prizes.get(i).getWinningRate())*(prizes.get(i).getCouponQty() == 0 || prizes.get(i).getCanAward().equals("0") ? 0 : 1)/sumWeight;if(i==0){d1 = 0;}else{d1 +=Double.parseDouble(prizes.get(i-1).getWinningRate())*(prizes.get(i-1).getCouponQty() == 0 || prizes.get(i-1).getCanAward().equals("0") ? 0 : 1)/sumWeight;}if(randomNumber >= d1 && randomNumber <= d2){random = i;break;}}}catch(Exception e){System.out.println("生成抽奖随机数出错,出错原因:" +e.getMessage());}return random;}public static void main(String[] args) {List<RegisteredMarketingCouponMapping> prizes = new ArrayList<RegisteredMarketingCouponMapping>();String[] canAwards =    {"1",  "0",    "1",      "1",    "0",    "0",    "0",  "0"};Integer[] qty = {        100,   80,     1,       -1,     30,     150,     80,  150};String[] winningRates = {"0", "0.125", "0.0001", "0.0003", "0.025", "0.2", "0.1", "0.2"};for(int i = 0; i < 8; i++){RegisteredMarketingCouponMapping prize = new RegisteredMarketingCouponMapping();prize.setId("0000" + i);prize.setCanAward(canAwards[i]);prize.setCouponQty(qty[i]);prize.setWinningRate(winningRates[i]);prizes.add(prize);}PrizeMathRandom random = new PrizeMathRandom();for(int i = 0; i < 100; i++){System.out.println("index----------->" + random.getPrizeIndex(prizes));}}
}

调用上面抽奖算法的例子

抽奖用到的实体类:

package test;import java.io.Serializable;
/*** 抽奖活动-奖品关系实体类* @author robin_wang**/
public class RegisteredMarketingCouponMapping implements Serializable{/*** */private static final long serialVersionUID = 1L;/*** 抽奖活动-奖品id*/private String id;/*** 抽奖活动活动id*/private String registeredMarketingId;/*** 奖品id*/private String couponId;/*** 中奖概率*/private String winningRate;/*** 奖品剩余数量* 如果为负数则为无穷多* 如果为0,不参与后台抽奖仅做微端展示* 如果大于0则参与后台出奖,抽中时数量减1*/private Integer couponQty;/*** 是否可出奖  1 可出奖  0不出奖*/private String canAward;public String getId() {return id;}public void setId(String id) {this.id = id == null ? null : id.trim();}public String getRegisteredMarketingId() {return registeredMarketingId;}public void setRegisteredMarketingId(String registeredMarketingId) {this.registeredMarketingId = registeredMarketingId == null ? null : registeredMarketingId.trim();}public String getCouponId() {return couponId;}public void setCouponId(String couponId) {this.couponId = couponId == null ? null : couponId.trim();}public Integer getCouponQty() {return couponQty;}public void setCouponQty(Integer couponQty) {this.couponQty = couponQty;}public String getWinningRate() {return winningRate;}public void setWinningRate(String winningRate) {this.winningRate = winningRate;}public String getCanAward() {return canAward;}public void setCanAward(String canAward) {this.canAward = canAward;}}

本次做的抽奖活动逻辑:
一、业务需求:

1、微商城的会员可以进行抽奖,而且如果会员分享了活动页面,则会添加1次抽奖机会
2、抽奖活动和奖品挂关系时,要设置奖品的剩余数量、权重(概率)、是否出奖,奖品必须为8

二、建表:

奖品、抽奖活动、抽奖活动-奖品关系表、抽奖活动和会员关系表(考虑会员每分享一次活动多一次抽奖机会所建)、中奖记录表、会员奖品表(该表的奖品只有优惠券)

三、

抽奖的算法是根据每个奖品的权重进行的,所以权重可以填任意数字,本次考虑与用户好
理解,权重以概率相称,而且都是小于1的小数,所有奖品和必须为1。

四、做法:

1、奖品表初始化一个谢谢参与,始终不动,不在后台系统列表展示,也不能选择
2、为抽奖活动添加奖品不足8个保存时,后台会将剩下的几个全部以谢谢参与奖代替
3、编辑抽奖活动的概率时,谢谢参与奖的概率不能编辑,非谢谢参与奖的概率发生变化时,系统会自动计算谢谢参与奖的概率和并平分给当前活动的所有谢谢参与奖。谢谢参与奖必须出奖,且数量为无限多,否则出奖会出问题(因为要考虑到没有抽中奖品时转盘一定要落到谢谢参与上而不是说没有奖品了)。

五、不足:

1、因为当时用的是上个系统的数据库,不清楚有哪些表,建了个中奖记录表,一开始以为建错
了,不过误打误撞,因为我们的需求和上个系统有区别,我们的奖品除了优惠券和谢谢参与之
外还有虚拟奖(青海五日游等),微商城购物车页面要获取会员奖品表中的优惠券,然后进行
使用,更新会员奖品表和中奖记录表。虚拟奖线下使用更新中奖记录表。
2、下次做相关的业务可以用剩余数量做权重进行抽奖,而不是多一个概率字段,并且限制它的大小,以及某活动所有关系奖品的概率之和

项目微商城的抽奖活动小结相关推荐

  1. H5移动端项目案例、web手机微商城实战开发

    自微信生态圈一步步强大后,关于移动端购物的趋势,逐渐成为大众关心的内容,目前市场上关于移动商城的制定就有大量版本,比如.微商城.移动商城.移动webAPP.微信商城各等各种定义层出不穷,这就对于移动端 ...

  2. Vue 微商城项目(一)

    简介 这是一系列关于如何用Vue编写微商城的项目文档一,适合初学者与已学完Vue基础的读者.教程与vue3.x.vue-cli4,vant-ui等框架,简单易懂. 涉及知识点 vue项目创建 vue基 ...

  3. vue系列教程之微商城项目|项目介绍

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 欢迎加入团队圈子!与作者面对面!直接点击! 简介  这是一系列 ...

  4. rageframe2 数据库配置_RF 微商城 一款基于 RageFrame2 的免费开源的基础销售功能的微商城...

    RF 微商城 前言 基于 RageFrame2 的一款免费开源的基础销售功能的微商城,前端基于 uni-app,一端发布多端通用,目前已经适配 H5.微信小程序.QQ小程序.Ios App.Andro ...

  5. 二次开发手册——百家CMS微商城说明文档(5)

    系统目录结构 百家cms微商城最新版本可以在官方网站(http://bbs.baijiacms.com 官网目前已无法访问). 把下载后的压缩文件解压到你的WEB目录(或者任何目录都可以),框架的目录 ...

  6. 【VUE】微商城(七)----实现分类页面功能

    微商城源码 微商城后端接口项目以及部署说明包含API接口说明文档 1.分类页面的基本布局 1).分类页面左侧一级分类布局    1.找到CategoryView.vue页面,编写js代码,发送请求获取 ...

  7. 微商城分销系统的怎么选择_有没有免费开源支持多端的_OctShop

    说到微商城分销系统,经常刷微信朋友圈,微信群的朋友并不陌生,最初从卖红枣的,面膜的,发展到后来卖厨房用纸的,服装的.一批批微商城分销的链接,一张张的二维码名片充斥着朋友圈,很多朋友对此感到不甚厌烦的同 ...

  8. 微信商城基本知识,成都微商城怎么开发,公众号商城

    关于**微信商城开发**的有关问题都可以咨询我. 微信商城简称微商城,微商城是基于当前很受欢迎的微信的一种传媒方式中的一种商业运用,微信当前的火热是一个商机,基于微信的传播速度,及其简便等优点,为商家 ...

  9. (开源)基于vue, react, node.js, go开发的微商城(含微信小程序)

    微商城 地址: https://github.com/shen100/wemall 求star,求关注 项目截图 微信小程序 项目环境搭建 1 克隆代码 git clone https://githu ...

  10. 【VUE】微商城(八)----商品列表,商品详情页

    微商城源码 微商城后端接口项目以及部署说明包含API接口说明文档 1.分类页跳转商品列表 1).在pages文件夹下创建一个goods文件夹,并且在goods文件夹创建一个GoodsListView. ...

最新文章

  1. 解决Lync Server 2013无法共享演示PPT
  2. 在Android中取得当前进程名
  3. java short字段_Java Field setShort()用法及代码示例
  4. nginx转发websocket
  5. PHP 字符串编码处理 (附各语言的字符集编码范围)
  6. 边缘计算是流行词还是风口?开发者怎样选开源项目?
  7. lucene 增量 全量 更新索引_搜索引擎:该如何设计你的倒排索引?
  8. 【Data guard】Switchover切换
  9. 登录显示离线_使用emoji加密文本;nali—终端离线查询 IP 地理信息
  10. 网上Silverlight项目收集
  11. hdu 5996 dingyeye loves stone(博弈)
  12. 1.0-并发编程-进程和线程简介
  13. 贴花纸怎么贴_地砖保护膜怎么贴—怎么贴地砖保护膜
  14. Phonegap(Cordova)3.4 + Android 环境搭建
  15. 廊坊金彩教育:店铺装修怎么更吸引客户
  16. 毕业设计 基于单片机的万能红外遥控器 - 物联网 嵌入式
  17. 基于卷积神经网络(CNN)的图像识别 之 火焰识别
  18. 2014科技十大名词——如果之前你不知道,证明你是行外人,如果你只是听说,证明你只是是爱好者
  19. 旖旎风景——浪漫烟花(Python实现)
  20. 秀动脚本增加微信通知和多账号抢购

热门文章

  1. 今天一篇文章告诉你Python 自动化测试 必会模块 Unittest
  2. k8s学习笔记2-搭建harbor私有仓库
  3. linux如何把系统盘转换成gpt,如何更改/转换Ubuntu MBR驱动器到GPT,并从EFI启动Ubuntu?...
  4. 【语音识别】食物声音识别(三)音频数据特征提取
  5. 跟着Nature学作图:最强“ 颠覆性 ”技术,您确定不学学?助力发Nature顶刊!...
  6. html页面设置过期时间,meta标签http-equiv=Expires属性写法及用法
  7. docker笔记(转自:陈沙克日志)
  8. 微信视频号视频免费下载最新的4种办法
  9. H3C交换机配置trunk
  10. 基于Android的数据传输wifi,基于ANDROID平台的WIFI文件传输系统的研究与实现