Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中具有固定平均值的随机整数数组_Java_Arrays_Algorithm_Random - Fatal编程技术网

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

java中具有固定平均值的随机整数数组,java,arrays,algorithm,random,Java,Arrays,Algorithm,Random,我需要创建一个随机整数数组,它们的和是1000000,这些数字的平均值是3。数组中的数字可以重复,数组的长度可以是任意数字 我能找到随机整数的数组,它们的和是1000000 ArrayList<Integer> array = new ArrayList<Integer>(); int a = 1000000; Random rn = new Random(); while (a >= 1) { int an

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

我将横切列表两次,如果这两个位置的整数相加并除以2==3,则返回,否则,增加整数。

我将横切列表两次,如果这两个位置的整数相加并除以2==3,则返回,否则,增加整数。

这在数学上是不可能的:


您正在查找n个值,其总和为1000000,它们的平均值为3,即1000000/n。因为n只能取整数值,所以这是不可能的。

这在数学上是不可能的:


您正在查找n个值,其总和为1000000,它们的平均值为3,即1000000/n。因为n只能取整数值,所以这是不可能的。

我认为您需要编写一个简单的平均函数,如:

public double average(ArrayList<Integer> array){

    long sum = 0;
    int count = 0;
    for (Integer item : array){
        sum += item;
        count++;
    }
    return sum/count;
}

我认为您需要编写一个简单的平均函数,如:

public double average(ArrayList<Integer> array){

    long sum = 0;
    int count = 0;
    for (Integer item : array){
        sum += item;
        count++;
    }
    return sum/count;
}

正如Göker Gümü351;所说,从数学上讲,平均数不可能精确到3,总和不可能精确到100万

平均值=元素的总和/数量。 这意味着元素数量=总和/平均值

在这种情况下,它需要1000000/3=3333个元素。因为一个元素不能有三分之一的值为3,这意味着你的平均值或总和需要稍微偏离你的目标值才能匹配。
所需的不太显著的差异肯定是平均值,因为它只需要百万分之一个单位,即3.000001,你就可以有333333个元素的总和为1000000,正如Göker Gümş所说,从数学上讲,平均值不可能精确为3,总和为一百万

平均值=元素的总和/数量。 这意味着元素数量=总和/平均值

在这种情况下,它需要1000000/3=3333个元素。因为一个元素不能有三分之一的值为3,这意味着你的平均值或总和需要稍微偏离你的目标值才能匹配。
所需的不太明显的差异肯定是平均值,因为它只需要百万分之一个单位,即3.000001,您就可以将333333个元素相加为1000000个元素。这个问题有很多答案,但假设我们希望我们的随机数最多为10个,我们可以更改。我想这会给出一个令人满意的答案

import java.util.Random;
导入java.util.ArrayList

公开课平均分{

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

}

这个问题有很多答案,但假设我们希望我们的随机数最大为10,我们可以更改。我想这会给出一个令人满意的答案

import java.util.Random;
导入java.util.ArrayList

公开课平均分{

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

}

如果将它们约束为平均值和随机值,则必须将它们约束为值范围。中位数为3的1到5的范围似乎是合理的。同样合理的是平滑分布,它给出了已知的总数和平均数

这段简单的代码将完成以下所有功能:

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/3的余数为1/3,但此代码非常接近:

1000000/333334 => 2.999994

如果将它们约束为平均值和随机值,则必须将它们约束为值范围。中位数为3的1到5的范围似乎是合理的。同样合理的是平滑分布,它给出了已知的总数和平均数

这段简单的代码将完成以下所有功能:

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/3的余数为1/3,但此代码非常接近:

1000000/333334 => 2.999994

我不明白你们在找什么,请强调你们的问题,有随机数的范围吗?他们应该都是积极的吗?包括零吗?@RoeyGolzarpoor抱歉,如果这个问题解释得不够清楚的话。你不明白哪一部分?简单地说,我需要生成随机数,它们的和是1000 000,它们的平均值除以它们的和是3。@Bohemian,它们应该都是正的。如果和是1000000,平均值必须是3,那么你的数组必须有333个元素不准确,但尽可能接近。我不明白你们在找什么,请强调你们的问题有一系列随机数吗?他们应该都是积极的吗?包括零吗?@RoeyGolzarpoor抱歉,如果这个问题解释得不够清楚的话。你不明白哪一部分?简单地说,我需要生成随机数,它们的和是1000 000,它们的平均值除以o
f它们是3。@Bohemian,它们都应该是正的。如果总和是1000000,平均数必须是3,那么你的数组必须有333333个元素不精确,但尽可能接近。如果我们认为n等于333333,除了其中一个是4之外,所有元素都是3,那么总和将是1000000。int a=1000000/n在java中是3,但它们的实际平均值应该是3.00003000003。如果我们认为n等于333333,除了其中一个是4外,所有的都是3,总和应该是1000000。int a=1000000/n在java中是3。但是它们的实际平均值应该是3.00003000003。你能给你的答案添加一个解释吗?是的,每次我们向数组中添加一个新的数字时,我们都会检查平均值是否可以除以3,如果不能,我们就把它添加到你的答案中。请更好地解释一下。你能在你的答案中添加一个解释吗?是的,每次我们在数组中添加一个新的数字,我们都会检查平均数是否可以除以3,如果不能,我们将退出while循环,并将其添加到你的答案中。请解释清楚。