题目:实现双色球彩票随机出号,六个红球,一个蓝球。并顺序输出
双色球规则:
“双色球”彩票投注区分为红色球号码区和蓝色球号码区。
“双色球”每注投注号码由6个红色球号码和1个蓝色球号码组成。
红色球号码从1--33中选择;蓝色球号码从1--16中选择。
两种思路:
- 随机6个不同的1-33范围内的数字(需要考虑重复问题)
- 模拟现实生活抽号场景
普通思路(随机数)
6个数需要随机且不能重复,所以需要实现思路,主要是针对红球
- 创建长度为 6 的数组
- 循环随机出1-33范围内数字,放入数组
- 放入时需要先判断是否已经在数组中存在,如果存在,则重新随机。
- 对数组排序
- 打印输出
具体代码如下:
public static void caipiao(){
Random random = new Random();
int[] red = new int[6];
for (int i = 0; i < red.length; ) {
int rand = random.nextInt(33);//产生一个随机数
//放入之前 要把rand和数组中的元素 逐一比较 看是否存在,存在则重新随机
boolean isExist = false;
//给定rand数 判断rand是否在数组red中存在
for (int j = 0; j < i+1; j++) {
if(rand==red[j]){//判断是否数组中存在此数
isExist = true;//表示 数是存在于数组中的
break;
}
}
//放入
if(isExist==false){
red[i] = rand;
i++; //注意:只有放入成功后,才能修改下次放入的下标位置
}
}
//生成一个篮球
int blue = random.nextInt(16);
Arrays.sort(red);//排序
System.out.println(Arrays.toString(red)+"+"+blue);
}
上面的算法,存在的主要问题就是每次随机数都是一个独立的事件,所以每次的随机数是不可控,可能出现重复,所以就需要在放入前先判断重复问题。
但是在现实场景的抽号中是不存在判断重复问题的,因为,从箱子里取出的号码是不会再放入箱子的。下次抽取的号码是在之前抽出的剩余的号码中抽取的。
模拟抽奖思路
模拟真实场景下的抽号过程:
- 在一个箱子中放入编号为 1-33 的红球
- 在一个箱子中放入编号为 1-16 的蓝球
- 把两个箱子摇一摇,尽量打乱
- 分别从两个箱子中取出 6个红色球和 1个蓝色球
具体代码如下:
import java.util.*;
/**
* 模拟真实场景下的抽号过程
*/
public class Test1 {
public static void main(String[] args) {
caipiao();
}
public static void caipiao(){
//用来存放1-33红色球的箱子
List<Integer> redBox = new ArrayList<>(33);
//用来存放1-16蓝色球的箱子
List<Integer> blueBox = new ArrayList<>(16);
//依次放入33个红球和16个蓝球
for (int i = 1; i <= 33 ; i++) {
redBox.add(i);
if(i>16){
continue;
}
blueBox.add(i);
}
//随机打乱(摇箱子,打乱箱内球为无序)
Collections.shuffle(redBox);
Collections.shuffle(blueBox);
//从红球箱子中取出6个球
List<Integer> redList = redBox.subList(0,6);
Integer blueBall = blueBox.get(0);
Collections.sort(redList);//排序
System.out.println(redList+"+"+blueBall);
}
}
哪一个思路更好呢?你有没有其他思路?评论区留言讨论