将6986分成101个68~82之间的随机数

        利用Java语言产生固定范围内的随机数很容易,利用库中的Math.random() 方法就可以达到目的, 例如要产生一个m到n之间的正整型随机数, 可以写成 (int) (Math.random() * (m - n + 1)) + m就可以达到目的. 但如果让我们将6986分解成101个随机数, 而且每个随机数在68~82之间, 这就不太好控制这些随机数的产生了.

  但我们可以换个思考方向,将问题分解, 将这个大问题分解成多个易实现的部分, 这样容易多了.

  第一步: 我们先随机产生101个68~82之间的随机数,将这些随机数存储在一个数组中. 我们计算一下这个数组所有元素的和, 绝大部分情况下,这个和值与我们预期的和值6986几乎不可能相同, 然后我们计算一下两者的差值


                 // 数组预期的和值
		int number = 6986;
		// 实际和值与预期和值的差
		int x = 0;
		int count = 0;
		int[] a = new int[101];
		int sum = 0;
		// 将101个元素的数组随机赋给68~82之间的值
		for (int i = 0; i < 101; i++) {
				int random = (int)(Math.random() * 15 + 68);
				a[i] = random;
			    sum += a[i];
		}
		// 判断赋值之后数据实际和值和预期和值之间的差
		x = sum - number;

         第二步:根据我们计算的差值, 尽量平均的裁剪或者增添数组中元素的值 . 例如我们的差值x=10,我们就遍历数组,将数组中大于68的数都减1,直到数组所有元素和恰好等于6986差值x变为了0,就结束遍历. 这样, 我们就达到了101个68~82之间随机数和为6986的要求. (当然, 和值6986和随机数范围都可以修改成你想要的数据)

// 根据差值的大小平均裁剪或增添数组元素的值(使元素保持在68-82之间)
		if (x > 0) {
			while (x != 0) {
				count = 0;
				for (int i = 0; i < a.length; i++) {
					if (a[i] > 68 && sumArr(a)!= number) {
						a[i] = a[i] - 1;
						count += 1;
					}
				}
				x = x - count;
			}
		} else {
			while (x != 0) {
				count = 0;
				for (int i = 0; i < a.length; i++) {
					if (a[i] < 82 && sumArr(a)!= number) {
						a[i] = a[i] + 1;
						count += 1;
					}
				}
				x = x + count;
			}
		}

              System.out.println(Arrays.toString(a));
               System.out.println(sumArr(a));

      // 计算当前数组的和
	static int sumArr(int[] arr){
		int sumArray = 0;
		for (int i = 0; i < arr.length; i++) {
			sumArray += arr[i];
		}
		return sumArray;
	}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值