团队Github实战训练
班级:软件工程1916|W
作业:团队Github实战训练
团队名称:SkyReach
Github地址:Github地址
贡献比例表
| 队员学号 | 队员姓名 | 此次活动任务 | 贡献比例 | 
|---|---|---|---|
| 221600106 | 陈鸿 | 资料查询,代码审查 | 4% | 
| 221600107 | 陈家豪 | 安排任务,撰写博客,抽奖功能编码 | 12% | 
| 221600110 | 公孙骏杰 | 资料查询,代码审查 | 4% | 
| 221600117 | 黄盛远 | 文件数据格式化输入,数据接口设计 | 26% | 
| 221600118 | 李鸿斌 | 抽奖算法设计,抽奖功能编码 | 23% | 
| 221600120 | 李子琪 | UI设计与编码 | 20% | 
| 221600122 | 史云天 | 文件数据格式化输入,数据接口设计 | 11% | 
Github提交日志截图

程序运行截图



GUI

基础功能实现
本算法具有以下模式:
- 不过滤模式:剔除系统、助教、老师,所有参与抽奖的发言,都纳入开奖范围。 
- 普通模式:每个账号只占有一条有效抽奖信息。 
- 深度模式 - 在普通模式的基础上,为了使发言更有意义,提高用户活跃度: - 有效发言越多,中奖几率越大
 
随机抽奖的算法:
LCG算法
我们的抽奖算法基于LCG算法,LCG(linear congruential generator)线性同余算法,是一个古老的产生随机数的算法。
本算法有以下优点:
- 计算速度快:抽奖时的算法时间复杂度是一个较大的问题,在微博开奖的时候,由于抽奖人数众多,(例如王思聪的抽奖微博,转发量、评论数、点赞数均达到了两千万,总数达到了六千万,输入量十分巨大)所以常常需要花费几十分钟的时间开奖,如此的算法性能是难以忍受的。对此,我们的算法基于LCG算法,利用其速度优势,减少开奖时间。
- 易于实现:算法易于理解,可以通过改变取余数来控制算法的空间复杂度与随机分布效果。且算法是线性的算法,和非线性的模型相比,具有较低的复杂度。
- 易于推广:本算法改变取余参数,对空间资源和随机准确率权衡,根据不同的设备资源和计算能力调优,具有很强的灵活性,易于使用推广。
本算法基于的LCG算法由以下参数组成:
| 参数 | m | a | c | X | 
|---|---|---|---|---|
| 性质 | 模数 | 乘数 | 加数 | 随机数 | 
| 作用 | 取模 | 移位 | 偏移 | 作为结果 | 
LCG算法是如下的一个递推公式,每下一个随机数是当前随机数向左移动 log2 a 位,加上一个 c,最后对 m 取余,使随机数限制在 0 ~ m-1 内

从该式可以看出,该算法由于构成简单,具有以下优点:
- 计算速度快
- 易于实现
- 易于写入硬件
代码具体实现
public class Random {
	//LCG算法的实现
	public final AtomicLong seed=new AtomicLong();
	public final static long C = 1;
	public final static long A = 48271;
	public final static long M = (1L << 31) - 1;
	public Random(int seed){
		this.seed.set(seed);
	}
	public Random(){
		this.seed.set(System.nanoTime());
	}
	public long nextLong(){
		seed.set(System.nanoTime());
		return (A *seed.longValue() + C) % M;
	}
	public int nextInt(int number){
		return new Long( (A * System.nanoTime()/100+ C) % number).intValue();
	}
	public int[] getLucky(int num){
		Map<Integer,Integer> map=new HashMap<Integer,Integer>();
		for(int i=0;i<100000;i++){
			int ran=new Random().nextInt(num);
			if(map.containsKey(ran)){
				map.put(ran, map.get(ran)+1);
			}else{
				map.put(ran, 1);
			}
		}
		int []luck = new int[num];
		Iterator iter = map.entrySet().iterator();
		while (iter.hasNext())
		{
			Map.Entry entry = (Map.Entry) iter.next();
			int key = (Integer)entry.getKey();
			int value = map.get(key);
			luck[key]=value;
		}
		return luck;
	}
附加功能实现
通过哈希表储存从文本读入的数据,对其进行有效发言判定,以及有效发言数量的计算,从而对用户中奖几率的改变。以下为代码实现:
public class Way {
	public static Way create(){
		Way way=new Way();
		return way;
	}
	//不过滤抽奖名单
	public List<String> none(List<String> qqs,int num){
		HashMap<String,Integer> map=new HashMap<String,Integer>();
		int luck[]=new Random().getLucky(qqs.size());
		for(int i=0;i<qqs.size();i++){
			map.put(qqs.get(i), luck[i]);
		}
		List<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
		Collections.sort(list,new Comparator<Map.Entry<String,Integer>>() {
	            public int compare(Entry<String, Integer> o1,
	                    Entry<String, Integer> o2) {
	                return -o1.getValue().compareTo(o2.getValue());
	            }
	     });
		list=list.subList(0, num);
		List<String> thenone=new ArrayList<String>();
		for(Map.Entry<String,Integer> m:list){
			thenone.add(m.getKey());
		} 
		return thenone;
	}
	//普通过滤抽奖名单
	public List<String> common(HashMap<String, List<Record>> msgs,ProcessQQLog user,int num){
		msgs=clearAssit(msgs,user);
		List<String> qqs=new ArrayList<>(msgs.keySet());
		qqs=none(qqs,num);
		return qqs;
	}
	//深度过滤抽奖名单
	public List<String> deep(HashMap<String, List<Record>> msgs,ProcessQQLog user,int num){
		msgs=clearAssit(msgs,user);
		return none(msgRate(msgs,num),num);
	}
	//将助教及老师从开奖名单中删除
	public HashMap<String, List<Record>>  clearAssit(HashMap<String, List<Record>> msgs,ProcessQQLog user){
		Iterator iter = msgs.entrySet().iterator();
		while (iter.hasNext())
		{
			Map.Entry entry = (Map.Entry) iter.next();
			String qq = (String)entry.getKey();
			String name=user.getQQName(qq);
			if(name.contains("助教")||name.contains("老师")||qq.equals("10000")||qq.equals("1000008")){
				iter.remove();
				msgs.remove(qq);
			}
		}
		return msgs;
	}
	//对有效发言次数进行排序 有效发言次数越多中奖几率越大
	public List<String> msgRate(HashMap<String, List<Record>> msgs,int num){
		if(num<20) num*=2;
		HashMap<String,Integer> qqN=new HashMap<String,Integer>();
		Iterator iter = msgs.entrySet().iterator();
		while (iter.hasNext())
		{
			Map.Entry entry = (Map.Entry) iter.next();
			String qq = (String)entry.getKey();
			List<Record> list = (List<Record>)entry.getValue();
			qqN.put(qq, list.size());
		}	
		List<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(qqN.entrySet());
		Collections.sort(list,new Comparator<Map.Entry<String,Integer>>() {
	            public int compare(Entry<String, Integer> o1,
	                    Entry<String, Integer> o2) {
	                return -o1.getValue().compareTo(o2.getValue());
	            }
	      });
		list=list.subList(0, num);
		List<String> themsg=new ArrayList<String>();
		for(Map.Entry<String,Integer> m:list){
			themsg.add(m.getKey());
		} 
		return themsg;
	}
}
鼓励有想法且有用的功能
通过哈希表储存从文本读入的数据,对其进行有效发言判定,以及有效发言数量的计算,从而对用户中奖几率的改变。
遇到的困难及解决方法
- 组员 李子琪 - 困难 - 有段时间没有接触GUI编写,很多功能又需要重新学习掌握;
- 由于负责界面的编写,所以有时需要等待队友提供的数据形式才能进行测试;
 - 解决 - 通过百度再次了解掌握各种组件与监听器等;
- 提前与队友沟通决定数据传递的参数,提前先自己进行数据对接,等队友完成后再进行测试。
 
- 组员 李鸿斌 - 困难 - 各种数据结构的相互转换
 - 解决 - 查阅相关api和搜索引擎,还有队友间相互讨论。
 
- 组员 黄盛远 - 困难 - 字符串匹配比较麻烦,甚至一些不好分辨
- 编码问题,造成结果与预计不同
 - 解决 - 上网学习了正则表达式,通过正则表达式匹配。
- 通过浏览他人博客,学习到utf-8与utf-8-dom编码的区别,通过代码将utf-8-dom转化为utf-8
 
- 组员 史云天 - 困难 - 分离标题栏和内容时不太好分离
 - 解决 - 最后采用正则表达式,来判断是否符合标题的格式,即日期-时间 网名 QQ号
 
- 组员 公孙骏杰 - 困难 - 问题主要集中在抽奖的机制上,既要提供一个公平公正的平台的条件下,还需要进行进一步的筛选过滤选择中奖用户
 - 解决 - 对结果进行深度过滤
 
- 组员 陈鸿 - 困难 - 队友间的相互沟通 版本更新有的不同,和同学的沟通沟通的函数有的需要分好几个变量而队友不需要
 - 解决 - 讨论了一会才达成一致意见。有的算法不会写查阅了相关资料才写出来。
 
- 组长 陈家豪 - 困难 - 如何搭建构建数据的组员和抽奖功能编程的组员之间的桥梁
 - 解决 - 构建数据接口,对两方组员阐述各自功能,完成统一的数据接口
 
PSP表格
陈鸿
| PSP2.1 | Pesonal SoftWare Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | 
|---|---|---|---|
| Planning | 计划 | 10 | 12 | 
| Estimate | 估计这个任务需要多少时间 | 120 | 140 | 
| Development | 开发 | 220 | 230 | 
| Analysis | 需求分析(包括学习新技术) | 60 | 70 | 
| Design Spec | 生成设计文档 | 30 | 40 | 
| Design Review | 设计复审 | 20 | 30 | 
| Coding Standard | 代码规范(为目前的开发制定合适的规范) | 0 | 0 | 
| Design | 具体设计 | 220 | 230 | 
| Coding | 具体编码 | 0 | 0 | 
| Code Review | 代码复审 | 0 | 0 | 
| Test | 测试(自我测试,修改代码,提交修改) | 40 | 50 | 
| Reporting | 报告 | 30 | 40 | 
| Test Report | 测试报告 | 10 | 10 | 
| Size Measurement | 计算工作量 | ||
| Postmortem&Process Improvement Plan | 事后总结,并提出过程改进计划 | 30 | 30 | 
| 合计 | 790 | 855 | 
李子琪
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | 
|---|---|---|---|
| Planning | 计划 | ||
| • Estimate | • 估计这个任务需要多少时间 | ||
| Development | 开发 | ||
| • Analysis | • 需求分析 (包括学习新技术) | 10 | 20 | 
| • Design Spec | • 生成设计文档 | 10 | 20 | 
| • Design Review | • 设计复审 | 20 | 25 | 
| • Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | ||
| • Design | • 具体设计 | 15 | 15 | 
| • Coding | • 具体编码 | 100 | 120 | 
| • Code Review | • 代码复审 | 10 | 15 | 
| • Test | • 测试(自我测试,修改代码,提交修改) | 20 | 40 | 
| Reporting | 报告 | ||
| • Test Report | • 测试报告 | 10 | 15 | 
| • Size Measurement | • 计算工作量 | 20 | 20 | 
| • Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 10 | 10 | 
| 合计 | 225 | 300 | 
李鸿斌
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | 
|---|---|---|---|
| Planning | 计划 | ||
| • Estimate | • 估计这个任务需要多少时间 | 180 | 190 | 
| Development | 开发 | ||
| • Analysis | • 需求分析 (包括学习新技术) | 30 | 40 | 
| • Design Spec | • 生成设计文档 | 10 | 10 | 
| • Design Review | • 设计复审 | 15 | 10 | 
| • Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 25 | 20 | 
| • Design | • 具体设计 | 15 | 10 | 
| • Coding | • 具体编码 | 30 | 35 | 
| • Code Review | • 代码复审 | 15 | 20 | 
| • Test | • 测试(自我测试,修改代码,提交修改) | 30 | 25 | 
| Reporting | 报告 | ||
| • Test Report | • 测试报告 | 20 | 20 | 
| • Size Measurement | • 计算工作量 | 10 | 10 | 
| • Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 20 | 30 | 
| 合计 | 230 | 230 | 
公孙骏杰
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | 
|---|---|---|---|
| Planning | 计划 | ||
| • Estimate | • 估计这个任务需要多少时间 | 10 | 10 | 
| Development | 开发 | ||
| • Analysis | • 需求分析 (包括学习新技术) | 50 | 70 | 
| • Design Spec | • 生成设计文档 | 30 | 50 | 
| • Design Review | • 设计复审 | 10 | 10 | 
| • Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 20 | 
| • Design | • 具体设计 | 60 | 60 | 
| • Coding | • 具体编码 | 150 | 180 | 
| • Code Review | • 代码复审 | 30 | 30 | 
| • Test | • 测试(自我测试,修改代码,提交修改) | 20 | 20 | 
| Reporting | 报告 | ||
| • Test Report | • 测试报告 | 20 | 20 | 
| • Size Measurement | • 计算工作量 | 10 | 10 | 
| • Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 40 | 40 | 
| 合计 | 560 | 630 | 
史云天
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | 
|---|---|---|---|
| Planning | 计划 | 20 | 10 | 
| • Estimate | • 估计这个任务需要多少时间 | 10 | 5 | 
| Development | 开发 | ||
| • Analysis | • 需求分析 (包括学习新技术) | 60 | 50 | 
| • Design Spec | • 生成设计文档 | 30 | 40 | 
| • Design Review | • 设计复审 | 20 | 10 | 
| • Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 40 | 30 | 
| • Design | • 具体设计 | 30 | 20 | 
| • Coding | • 具体编码 | 180 | 240 | 
| • Code Review | • 代码复审 | 20 | 30 | 
| • Test | • 测试(自我测试,修改代码,提交修改) | 60 | 60 | 
| Reporting | 报告 | ||
| • Test Report | • 测试报告 | 30 | 40 | 
| • Size Measurement | • 计算工作量 | 10 | 5 | 
| • Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 25 | 
| 合计 | 540 | 565 | 
黄盛远
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 
|---|---|---|
| Planning | 计划 | |
| • Estimate | • 估计这个任务需要多少时间 | 180 | 
| Development | 开发 | |
| • Analysis | • 需求分析 (包括学习新技术) | 10 | 
| • Design Spec | • 生成设计文档 | 10 | 
| • Design Review | • 设计复审 | 15 | 
| • Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 5 | 
| • Design | • 具体设计 | 15 | 
| • Coding | • 具体编码 | 60 | 
| • Code Review | • 代码复审 | 15 | 
| • Test | • 测试(自我测试,修改代码,提交修改) | 30 | 
| Reporting | 报告 | |
| • Test Report | • 测试报告 | 20 | 
| • Size Measurement | • 计算工作量 | 10 | 
| • Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 20 | 
| 合计 | 195 | 
陈家豪
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | 
|---|---|---|---|
| Planning | 计划 | 20 | 10 | 
| • Estimate | • 估计这个任务需要多少时间 | 10 | 5 | 
| Development | 开发 | ||
| • Analysis | • 需求分析 (包括学习新技术) | 60 | 30 | 
| • Design Spec | • 生成设计文档 | 30 | 40 | 
| • Design Review | • 设计复审 | 20 | 10 | 
| • Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 40 | 30 | 
| • Design | • 具体设计 | 30 | 20 | 
| • Coding | • 具体编码 | 180 | 200 | 
| • Code Review | • 代码复审 | 20 | 30 | 
| • Test | • 测试(自我测试,修改代码,提交修改) | 60 | 60 | 
| Reporting | 报告 | ||
| • Test Report | • 测试报告 | 30 | 40 | 
| • Size Measurement | • 计算工作量 | 10 | 5 | 
| • Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 25 | 
| 合计 | 540 | 505 | 
学习进度表
| 姓名 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 | 
|---|---|---|---|---|---|
| 陈家豪 | 100 | 100 | 10 | 10 | 复习JAVA,学习LCG算法 | 
| 李子琪 | 400 | 400 | 12 | 12 | 复习JAVAUI设计 | 
| 黄盛远 | 250 | 250 | 15 | 15 | 复习JAVA,学习使用哈希表 | 
| 史云天 | 100 | 100 | 8 | 8 | 复习JAVA,学习使用哈希表 | 
| 李鸿斌 | 170 | 170 | 10 | 10 | 复习JAVA,学习LCG算法 | 
| 公孙骏杰 | 50 | 50 | 7 | 7 | 复习JAVA | 
| 陈鸿 | 50 | 50 | 7 | 7 | 复习JAVA | 
团队Github实战训练的更多相关文章
- 团队作业第六次—团队Github实战训练
		作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 团队作业第六次-团队Github实战训练 团队目标 搭建一个相对公平公正的抽奖系统,根据QQ聊天记录,完成从统计参与抽 ... 
- 团队作业第六次——团队Github实战训练
		作业格式 课程名称:软件工程1916|W(福州大学) 作业要求:团队作业第六次-团队Github实战训练 团队名称:葫芦娃队 作业目标:确定和分析选题,绘制评审表 github地址:https://g ... 
- 团队作业第六次—团队Github实战训练(追光的人)
		所属课程 软件工程1916 作业要求 团队作业第六次-团队Github实战训练 团队名称 追光的人 作业目标 搭建一个相对公平公正的抽奖系统,根据QQ聊天记录,完成从统计参与抽奖人员颁布抽奖结果的基本 ... 
- 团队作业第六次-团队Github实战训练
		格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目系统设计与数据库设计 团队名称:为了交项目干杯 GitHub地址:地址 作业目标:搭建一个相对公平公正的抽奖系统,根据QQ聊天记录, ... 
- 团队Github实践训练
		这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 团队名称 WeChair 这个作业要求在哪里 团队Github实践训练 这个作业的目标 通过github实现团队协作编码 作业正 ... 
- 团队 Gitee 实战训练
		这个课程属于 https://edu.cnblogs.com/campus/fzzcxy/2018SE2 这个作业要求在哪里 https://edu.cnblogs.com/campus/fzzcxy ... 
- 07.GitHub实战系列~7.Git之VS2013团队开发(如果不想了解git命令直接学这篇即可)
		GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ... 
- 第05组团队Github现场编程实战
		第05组团队Github现场编程实战 一.组员职责分工 组员 分工 卢欢(组长) 前后端接口设计 严喜 寻找相关资料 张火标 设计并描述界面原型 钟璐英 编写随笔 周华 填写完善文档 古力亚尔·艾山 ... 
- GitHub实战系列汇总篇
		基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ... 
随机推荐
- CSS弹性盒模型(flex box)
			本文介绍的是 CSS3 规范中引入的新布局模型:弹性盒模型(flex box).随着响应式用户界面的流行,Web 应用一般都要求适配不同的设备尺寸和浏览器分辨率. 浏览器支持: 弹性盒布局的容器(fl ... 
- QinQ 简介
			QinQ 是一种二层隧道协议,通过将用户的私网报文封装上外层 VLAN Tag,使其携带两层 VLAN Tag 穿越公网,从而为用户提供了一种比较简单的二层VPN隧道技术.QinQ 的实现方式可分为两 ... 
- 身份认证功能chiro的使用
			package com.cun;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.*;import org.apa ... 
- 安装 VMware  CentOS   Xmanager Xshell
			1.CentOS下载CentOS是免费版,推荐在官网上直接下载,网址:https://www.centos.org/download/DVD ISO:普通光盘完整安装版镜像,可离线安装到计算机硬盘上, ... 
- centos7之zabbix简单检查之端口监控
			1.创建模板 模板名字可以随便起 2.重点在监控项和触发器上. 3.比如我们创建一个监控25端口号的监控项 net.tcp.service[tcp,,25] 这个选项不是手动写上去的,是需要点击选择. ... 
- CentOS7桌面版系统使用的一些小技巧
			1. 清空~/.kde/ 文件下的文件,登陆后不显示桌面的解决方法 在使用CentOS7 桌面系统时,有时候打开文件会很卡.这时我们需要清空当前用户下的 .kde 文件下的所有文件. 再重新登陆该用户 ... 
- postgresql数据库中~和like和ilike的区别
			~(暂且叫他波浪号吧) 和 LIKE 和 ILIKE 操作符可以模糊匹配字符串,LIKE是一般用法,ILIKE匹配时则不区分字符串的大小写,~ 波浪号则可以使用正则匹配. LIKE和 ILIKE 它 ... 
- [LOJ3087][GXOI/GZOI2019]旅行者——堆优化dijkstra
			题目链接: [GXOI/GZOI2019]旅行者 我们考虑每条边的贡献,对每个点求出能到达它的最近的感兴趣的城市(设为$f[i]$,最短距离设为$a[i]$)和它能到达的离它最近的感兴趣的城市(设为$ ... 
- windows无法完成安装,若要在此计算机上安装,请重新启动安装
			当出现如上提示的时候,不要重启,按下shift+f10 会打开命令窗口,先输入cd oobe 进入到C:\windows\system32\oobe文件夹,输入msoobe回车然后输入msoobe即可 ... 
- markdown生成的a标签如何在新页面打开
			原始的超链接语法这样写:[超链接的名字](url) 在新窗口中打开:[超链接的名字](url?_blank) 在本窗口中打开:[超链接的名字](url?_self)默认是在本窗口中打开 但上面的说法貌 ... 
