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;
	}
}

每天进步一点点!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值