班级:软件工程1916|Wgit
做业:团队Github实战训练github
团队名称:SkyReach正则表达式
Github地址:Github地址算法
队员学号 | 队员姓名 | 这次活动任务 | 贡献比例 |
---|---|---|---|
221600106 | 陈鸿 | 资料查询,代码审查 | 4% |
221600107 | 陈家豪 | 安排任务,撰写博客,抽奖功能编码 | 12% |
221600110 | 公孙骏杰 | 资料查询,代码审查 | 4% |
221600117 | 黄盛远 | 文件数据格式化输入,数据接口设计 | 26% |
221600118 | 李鸿斌 | 抽奖算法设计,抽奖功能编码 | 23% |
221600120 | 李子琪 | UI设计与编码 | 20% |
221600122 | 史云天 | 文件数据格式化输入,数据接口设计 | 11% |
本算法具备如下模式:编程
不过滤模式:剔除系统、助教、老师,全部参与抽奖的发言,都归入开奖范围。api
普通模式:每一个帐号只占有一条有效抽奖信息。数组
深度模式数据结构
在普通模式的基础上,为了使发言更有意义,提升用户活跃度:dom
随机抽奖的算法:函数
咱们的抽奖算法基于LCG算法,LCG(linear congruential generator)线性同余算法,是一个古老的产生随机数的算法。
本算法有如下优势:
本算法基于的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; } }
经过哈希表储存从文本读入的数据,对其进行有效发言断定,以及有效发言数量的计算,从而对用户中奖概率的改变。
组员 李子琪
困难
解决
组员 李鸿斌
困难
解决
组员 黄盛远
困难
解决
组员 史云天
困难
解决
组员 公孙骏杰
困难
解决
组员 陈鸿
困难
解决
组长 陈家豪
困难
解决
陈鸿
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 |