java中具有固定平均值的随机整数数组

时间:2015-04-27 23:05:14

标签: java arrays algorithm random

我需要创建一个随机整数数组,其总和为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的随机数。

6 个答案:

答案 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);
}

}