最近身边很多人玩双色球。。我也买了几期。
下面是双色球模拟程序,代码如下:
package Test;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;import Test.util.ConnectionUtil;/**6个为红球(1—33),1个为蓝球(1—16)*/
public class ColorBall {public static void main(String[] args) {try {Connection conn=ConnectionUtil.getConnection();Statement stmt = conn.createStatement();PreparedStatement ps=null;String sql = "insert into ball values(BALLID_SEQ.NEXTVAL,?,?,?,?,?,?,?,sysdate)";ps=conn.prepareStatement(sql);//循环购买双色球2400000注for(int c=0;c<2400000;c++){List luckBalls=makeLuck();for(int i=0;i<luckBalls.size();i++){String num=Integer.toString((Integer)luckBalls.get(i));ps.setString(i+1,num);}ps.executeUpdate();}stmt.close();conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//产生一期幸运球public static List makeLuck(){List balls=new ArrayList();List luckBalls=new ArrayList();for(int i=0;i<33;i++){balls.add(i+1);}for(int i=0;i<6;i++){int luckIndex=(int)(Math.random()*(balls.size()));luckBalls.add(balls.get(luckIndex));balls.remove(luckIndex);}luckBalls.add((int)(Math.random()*16)+1);return luckBalls;}}
数据库情况:
建表语句:
-- Create table
create table BALL
(OPENID VARCHAR2(10) not null,RED1 VARCHAR2(10) not null,RED2 VARCHAR2(10) not null,RED3 VARCHAR2(10) not null,RED4 VARCHAR2(10) not null,RED5 VARCHAR2(10) not null,RED6 VARCHAR2(10) not null,BLUE1 VARCHAR2(10) not null,DATETIME DATE
)
tablespace USERSpctfree 10initrans 1maxtrans 255storage(initial 64next 8minextents 1maxextents unlimited);
-- Create/Recreate primary, unique and foreign key constraints
alter table BALLadd constraint ID primary key (OPENID)using index tablespace USERSpctfree 10initrans 2maxtrans 255storage(initial 64Knext 1Mminextents 1maxextents unlimited);
-- Create/Recreate indexes
create unique index IDX_TEST on BALL (OPENID DESC)tablespace USERSpctfree 10initrans 2maxtrans 255storage(initial 64Knext 1Mminextents 1maxextents unlimited);
买完彩票后数据库情况:
SQL> SELECT count(*) FROM ball;COUNT(*)
----------2400000
第二天查看中奖情况
从我的数据库中查询,看是否有满足中奖的条目:
--第2013083期 05 06 12 14 19 23 09
SQL> SELECT * FROM (2 SELECT * FROM (3 SELECT * FROM (4 SELECT * FROM ball WHERE blue1='9' and (red1+red2+red3+red4+red5+red6)=(05+06+12+14+19+23)5 and (red1=6 or red2=6 or red3=6 or red4=6 or red5=6 or red6=6))6 WHERE (red1=5 or red2=5 or red3=5 or red4=5 or red5=5 or red6=5))7 WHERE (red1=12 or red2=12 or red3=12 or red4=12 or red5=12 or red6=12))8 WHERE (red1=14 or red2=14 or red3=14 or red4=14 or red5=14 or red6=14);OPENID RED1 RED2 RED3 RED4 RED5 RED6 BLUE1 DATETIME
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- -----------
904191 14 22 12 20 6 5 9
2066183 5 12 14 20 22 6 9 2013/7/19 9
当前情况分析:
买了240万注彩票,人民币240*2万=480万元,有两注满足四个红球和一个蓝球满足条件,中奖200*2=400元。
中头等奖的概率和出门被车撞死的概率的比较:
中头等奖的概率:
SELECT 1/((33*32*31*30*29*28)/(6*5*4*3*2*1)*16) FROM dual --1/17721088
出门被车撞死的概率:
我们用2005年的车祸资料来说明一下,2005年全国共发生道路交通事故450254起,造成98738人死亡。
以13亿人每人平均300次出门来计算,2005出门被车撞死的概率很小 = 98738 /(13亿*300) 约等于千万分之2。
就是说一个人出门1千万次,有两次被撞死的可能
两个概率的关系:
SELECT (2/10000000)/(1/17721088) FROM dual --3.5442176
也就是说中头奖的概率为你出门被车撞死概率的3.5倍多,并且还是在一年之内。