身边一直有玩彩票的朋友,曾经有一天,朋友说让我开发一个帮助他买彩票的软件,当时连面向对象都没有搞清楚的我,
java代码:
硬是弄了一个给他,C#写的,完全用数组实现的,差不多包含了机选号码,号码分析,浏览器外链一个历史表等功能.
今日又突然想到这个事情,想用现在的技术再一次进行开发,除了用教好的方式再实现之前的功能外,在加入一些本人对数据的感悟(有一定的主观因素),来计算出彩票中奖号码,选定双色球这款比较热门的玩法来实现吧.
至于灵不灵就用时间来证明了,
第一步:机选号码
模拟双色球机选号码
package tool; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.Random; import java.util.Timer; public class ChoseNumber { /**从给定的集合里随机选择一个数字 * @param inputList 包含一串数字的集合 * @return 结果数字 */ private static int getNumber(ArrayList<Integer> inputList) { Random ran =new Random(); int i=ran.nextInt(inputList.size()); return inputList.get(i); } /**从给定的范围里生成一个不包括排除列表里元素的集合 * @param start 开始值 * @param end 结束值 * @param out 排除列表 * @return 不包括排除列表里元素的集合 */ private static ArrayList<Integer> makeArray(int start,int end,ArrayList<Integer> out) { ArrayList<Integer> res=new ArrayList<Integer>(); for (int i = start; i <= end; i++) { if (!out.contains(i)) { res.add(i); } } return res; } /**返回一个在指定范围内的指定个数的整数集合 * @param start 开始范围 * @param end 结束范围 * @param times 包含的整数个数 * @return 在 start 和 end 之间取 times 个 不重复的数字 */ public static ArrayList<Integer> getListOnTimes(int start,int end,int times) { ArrayList<Integer> out=new ArrayList<Integer>(); int temp=0; for (int i = 0; i < times; i++) { temp=getNumber(makeArray(start,end,out)); out.add(temp); } Collections.sort(out); return out; } public static void main(String[] args) { ArrayList<Integer> test=new ArrayList<Integer>(); test=getListOnTimes(1,33,6);//取6个红球 test.add(getListOnTimes(1,14,1).get(0));//取1个蓝球后组成一组号码 System.out.println(test); } }
第二步:机选2000万组号码,作为研究数据,因为数据大,分成一次生成10万条,分200次生成,生成后记录到mysql数据库
建表sql:
DROP TABLE IF EXISTS `coculatenumber_2000w_index_copy`; CREATE TABLE `coculatenumber_2000w_index_copy` ( `id` int(11) NOT NULL auto_increment, `r1` tinyint(4) NOT NULL, `r2` tinyint(4) NOT NULL, `r3` tinyint(4) NOT NULL, `r4` tinyint(4) NOT NULL, `r5` tinyint(4) NOT NULL, `r6` tinyint(4) NOT NULL, `b1` tinyint(4) NOT NULL, `date` datetime default NULL, `info` text, PRIMARY KEY (`id`), KEY `r1` USING BTREE (`r1`), KEY `r2` USING BTREE (`r2`), KEY `r3` USING BTREE (`r3`), KEY `r4` (`r4`), KEY `r5` (`r5`), KEY `r6` (`r6`), KEY `b1` USING BTREE (`b1`), KEY `allred` USING BTREE (`r1`,`r2`,`r3`,`r4`,`r5`,`r6`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
java代码:
package test; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import tool.ChoseNumber; import jdbc.DBHelper; public class Demo { public static void doByPart(int nums,int allnums,int start,int end,int all,String code) { long starttime=(new Date()).getTime(); ArrayList<Integer> test=new ArrayList<Integer>(); int i=start; String sql =""; String info =code; SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); DBHelper db = new DBHelper(); sql ="insert into coculatenumber_2000w_index SET r1=?, r2=?,r3=?,r4=?,r5=?,r6=?,b1=?,date=?,info=?"; try { db.conn.setAutoCommit(false); db.pst=db.conn.prepareStatement(sql); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } nums++; System.out.println("第"+nums+"部分生成中!共"+(end-start)+"条记录"); while (i<end) { i++; //System.out.println("正在生成号码:"+i+"/"+all); test=ChoseNumber.getListOnTimes(1,33,6); test.add(ChoseNumber.getListOnTimes(1,16,1).get(0)); try { db.pst.setInt(1, test.get(0)); db.pst.setInt(2, test.get(1)); db.pst.setInt(3, test.get(2)); db.pst.setInt(4, test.get(3)); db.pst.setInt(5, test.get(4)); db.pst.setInt(6, test.get(5)); db.pst.setInt(7, test.get(6)); db.pst.setString(8, df.format(new Date())); db.pst.setString(9, info); db.pst.addBatch(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { System.out.println("第"+nums+"部分写入中!共"+allnums+"部分"); db.pst.executeBatch(); db.conn.commit(); db.conn.close(); long endtime=(new Date()).getTime(); long times=(endtime-starttime)/1000; System.out.println("第"+nums+"部分写入完成!用时"+times+"秒"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { int part=100000; int all=20000000; int times=all/part; if (all%part!=0) { times++; } long starttime=(new Date()).getTime(); for (int i = 0; i < times; i++) { if (i*part<all&&i==times-1) { doByPart(i,times,i*part,all,all,"x008"); }else { doByPart(i,times,i*part,(i+1)*part,all,"x008"); } } long endtime=(new Date()).getTime(); long ltimes=(endtime-starttime)/1000; System.out.println("操作完成!耗时:"+ltimes+"秒."); } }