我需要创建一个随机整数数组,其总和为1000000,这些数字的平均值为3.数组中的数字可以重复,数组的长度可以是任意数。
我能够找到随机整数数组,它们的总和是1000000。
ArrayList<Integer> array = new ArrayList<Integer>();
int a = 1000000;
Random rn = new Random();
while (a >= 1)
{
int answer = rn.nextInt(a) + 1;
array.add(answer);
a -= answer;
}
但是,我不知道如何找到平均值为3的随机数。
答案 0 :(得分:4)
这在数学上是不可能的:
你正在寻找n个值,其总和为1000000,它们的平均值为3,即1000000 / n。因为n只能取整数值,所以不可能。
答案 1 :(得分:1)
如果它们被约束为平均值且随机,则必须将它们约束到值范围。 1到5的范围(中位数是3)似乎是合理的。同样合理的是平滑分布,它给出了已知的总和和平均值。
这个简单的代码将完成所有这些:
List<Integer> numbers = new ArrayList<>(333334); // 1000000 / 3
// one instance of 5 must be omitted to make total exactly 1000000
numbers.addAll(Arrays.asList(1, 2, 3, 4));
for (int i = 0; i < 333330; i++)
numbers.add((i % 5) + 1); // add 1,2,3,4,5,1,2,3,4,5,etc
Collections.shuffle(numbers);
// Check sum is correct
numbers.stream().reduce((a,b) -> a + b).ifPresent(System.out::println);
输出:
1000000
请注意,当总数为3
时,平均值在数学上不可能完全 1000000
(因为1000000/3
的余数为{{1}但是,这段代码非常接近:
1/3
答案 2 :(得分:0)
我会将列表横向移动两次,如果这两个位置的整数加在一起并除以2 == 3然后返回,否则,递增整数。
答案 3 :(得分:0)
我认为您需要编写一个简单的平均函数,如:
public double average(ArrayList<Integer> array){
long sum = 0;
int count = 0;
for (Integer item : array){
sum += item;
count++;
}
return sum/count;
}
然后在您的代码中使用它,如:
ArrayList<Integer> array = new ArrayList<Integer>();
int a = 1000000;
Random rn = new Random();
boolean isDone = true;
while (a >= 1)
{
int answer = rn.nextInt(a) + 1;
array.add(answer);
a -= answer;
if (average(array) % 3 != 0){
isDone = false;
break;
}
}
这个想法是每当我们向数组添加一个新数字时,我们检查平均值是否可以除以3,如果没有,我们就会退出while循环。
要告诉我们算法是否运行良好,我们需要在最后检查isDone
变量。
更有效的方法是:
ArrayList<Integer> array = new ArrayList<Integer>();
int a = 1000000;
Random rn = new Random();
boolean isDone = true;
long sum = 0;
while (a >= 1)
{
int answer = rn.nextInt(a) + 1;
array.add(answer);
a -= answer;
sum += answer;
if ((sum/array.size()) % 3 != 0){
isDone = false;
break;
}
}
答案 4 :(得分:0)
正如GökerGümüş所说,在数学上不可能使平均值正好为3而且总和为百万。
平均值=总和/元素数量。 这意味着元素数量= sum / average。
在这种情况下,它需要1000000/3 = 333333.(3)元素。由于您不能拥有值为3的元素的三分之一,这意味着您的平均值或总和需要略微偏离目标才能匹配。 不太显着的需要差异肯定是平均值,因为它只需要百万分之一的单位,即3.000001,你可以有333333元素总和为1000000
答案 5 :(得分:0)
这个问题有很多答案,但我们可以说我们希望我们的随机数最大为10(我们可以改变)。我想这会给出一个满意的答案。
import java.util.Random;
import java.util.ArrayList;
公共类RandomSumAverage {
public static void main(String[] args) {
Random random = new Random();
ArrayList<Integer> arr = new ArrayList<Integer>();
double sum = 0;
double avg = 0;
int k = 1;
while (sum < 1000000) {
avg = sum / k;
if (avg < 3) {
int element = random.nextInt(10)+1;
sum += element;
arr.add(element);
k++;
} else {
int element = random.nextInt(3)+1;
sum += element;
arr.add(element);
k++;
}
}
System.out.println(arr);
System.out.println(sum);
System.out.println(avg);
}
}