问题:
福彩双色球
红色球 :6个 从1-33中选出6个不能重复的数。
蓝色球:1个,从1-16中选择出一个数,蓝色球和红色球的数可以重复 。
编写方法 随机产生一注 前6位为红色球 最后一位为蓝色球 。
分析:
首先要生成随机数,由于需要生成红色和蓝色两种随机数,所以可以将生成随机数封装为方法或者工具类方便使用。
然后红色球数字不能重复,每次生成数字需要判断是否和之前的数字重复。第一种思路是每次生成一个数遍历数组中之前生成的数,这样写时间复杂度为O(n*n),双层循环效率低。
第二种思路为先定义一个长度为33内容为1-33的数组,每次生成红色球时将数组对应的位置值变为1-33之外的数,这里采用-1。每次生成随机数时如果数组对应位置是-1就重新生成。这样只有一个for循环就实现了,时间复杂度为O(N),推荐这种写法。
第一种思路
public class Test {
public static void main(String[] args) {
// 定义长度为7的数组
int[] arr = new int[7];
// 生成红色球
int n = 0;
while (true) {
// 设置标志是否有重复
boolean flag = true;
int red = (int) Math.floor(Math.random() * 33 + 1);
// 判断生成的随机数是否存在相等的
for (int j = 0; j < arr.length; j++) {
if (arr[j] == red) {
flag = false;
break;
}
}
// 如不不重复,就写进数组
if (flag) {
arr[n] = red;
n++;
}
// 数组长度为6退出
if (n > 5) {
break;
}
}
// 生成蓝色球
double blue = Math.round(Math.floor(Math.random() * 16 + 1));
arr[6] = (int) blue;
// 遍历数组输出
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
第二种思路
public class DoubleColorBall {
public static void main(String[] args) {
// 声明红色球号码数数组并写入1-33
int[] arr = new int[33];
for (int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
// 红色球
int[] red = new int[6];
for (int i = 0; i < red.length; i++) {
int index = gerRandom(33) - 1;
// 如果生成的数和前面生成的随机数不相等就写入红色球数组,并将号码数组该位置为-1
// 如果不相等循环再加一次循环
if (arr[index] != -1) {
// 将数组的数取出赋值给 红色球
red[i] = arr[index];
// 将这个位置设置成-1
arr[index] = -1;
} else {
i--;
}
}
// 蓝色球
int blue = gerRandom(16);
// 复制数组
int[] dcb = new int[7];
System.arraycopy(red, 0, dcb, 0, red.length);
dcb[dcb.length - 1] = blue;
System.out.println(Arrays.toString(dcb));
}
// 生成随机数方法
public static int gerRandom(int n) {
return ((int) (Math.random() * n)) + 1;
}
}
每天进步一点点!