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