近期一直在复习Java基础知识,确实不仅补缺查漏,还能增强记忆。同事提了个需求想要模拟一下双色球的输出,顺便练习一下刚学的Collection类。反正闲的没事,就决定练习一下。
一开始我想用Set最为简便,因为其自身值的唯一性,可以很好地去除随机值重复的问题。所以,一会儿就用Set写了下面这个版本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
/* *Create on Aug 20, 2012 * */ package com.doubleball; import java.util.HashSet; import java.util.Random; import java.util.Set; /** * @author zhiguo.chen * */ public class Ball { Set<Integer> RedBall = null; public Set<Integer> getRedBall() { return RedBall; } public void setRedBall(Set<Integer> redBall) { RedBall = redBall; } Set<Integer> BlueBall = null; public Set<Integer> getBlueBall() { return BlueBall; } public void setBlueBall(Set<Integer> blueBall) { BlueBall = blueBall; } public Set getRedBall(int x,int y){ Random ran = new Random(); Set<Integer> tmp = new HashSet<Integer>(); for(int i = 0;tmp.size()<x;i++){ tmp.add(ran.nextInt(y)); } this.RedBall=tmp; return RedBall; } public Set getBlueBall(int x,int y){ Random ran = new Random(); Set<Integer> tmp = new HashSet<Integer>(); for(int i = 0;tmp.size()<x;i++){ tmp.add(ran.nextInt(y)); } this.BlueBall=tmp; return BlueBall; } } |
但是此方法立马被质疑,再出球的概率问题上存在纰漏。出现第1个球的概率为1/32,第2,3,4·····个球的概率都是1/32。这样是不对的,因为真实的双色球中每一个球所出现的概率是不同的,第一个球的概率为1/32,第二个球的概率为1/31,第三个球的概率为1/30···以此类推。
所以经过重新考虑,便写了下面这个标准版,是基于List完成的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
/* *Create on Aug 20, 2012 * */ package com.doubleball; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * @author zhiguo.chen * */ public class ListBall { List<Integer> RedBall; public List<Integer> getRedBall() { return RedBall; } public void setRedBall(List<Integer> redBall) { RedBall = redBall; } List<Integer> BlueBall; public List<Integer> getBlueBall() { return BlueBall; } public void setBlueBall(List<Integer> blueBall) { BlueBall = blueBall; } public List getRedBall(int x,int y){ List tmp = new ArrayList(); Random ran = new Random(); int temp; //int total = y; for(int i=1;i<=x;i++){ tmp.add(i); } for(int i =1;i<=y;i++){ temp=ran.nextInt(x--); System.out.println("此球的概率为:"+(double)1/(x+1)); System.out.println("第"+i+"位红球为"+(tmp.get(temp))); tmp.remove(temp); } return RedBall; } public void getBlueBall(int x){ Random ran = new Random(); System.out.println("================================="); System.out.println("篮球即特别号码为:"+(ran.nextInt(x)+1)); } } |
然后下面是主函数所存在的类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
/* *Create on Aug 20, 2012 * *TODO */ package com.doubleball; import java.util.Random; import java.util.Set; /** * @author zhiguo.chen * */ public class DoubleBall { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Random ran = new Random(); //System.out.println(ran.nextInt(32)); Ball ball = new Ball(); Set RedBall =ball.getRedBall(6, 32); Set BlueBall = ball.getBlueBall(1,16); System.out.println("==========双色球大开奖============"); // System.out.println("红球为:"+RedBall); // System.out.println("蓝球为:"+BlueBall); ListBall lb = new ListBall(); lb.getRedBall(32, 6); lb.getBlueBall(16); } } |
其实整个都很简单,只是简单地事情让我重新构思了两次,让我觉得这件事情应该记录下来。还有就是网上的很多版本都是基于上面第一个Set版本做的,其实是不对的,功能虽然正确,但是内在的概率问题并不正确。如有错误,请您指正。
只有更新速度够快,俺们这些粉丝才能更忠实!
嗯嗯,好的~~