Java基础 -Random生成不同的随机数 福彩双色球问题

问题:
福彩双色球
红色球 :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;
	}
}

每天进步一点点!

全部评论

相关推荐

零offer🐭🐭:联合国宣传大使
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务