Java 随机数均值和标准差

Java 随机数均值和标准差,java,arraylist,Java,Arraylist,所以我有一个程序,有一个50个数字的长列表,随机数在1到50之间。我需要找到所述列表的平均值和标准偏差。我在把所有随机数相加时遇到了麻烦。 这是我目前掌握的代码: import java.util.Collections; import java.util.List; public class Main { public static void main(String[] args) { ArrayList<Integer> list = new Array

所以我有一个程序,有一个50个数字的长列表,随机数在1到50之间。我需要找到所述列表的平均值和标准偏差。我在把所有随机数相加时遇到了麻烦。 这是我目前掌握的代码:

import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 1; i < 51; i++) {
            list.add(new Integer(i));
        }

        Collections.shuffle(list);
        for (int i = 0; i < 50; i++) { // Set to 50 as max number just for example
        }
    }
}
import java.util.Collections;
导入java.util.List;
公共班机{
公共静态void main(字符串[]args){
ArrayList=新建ArrayList();
对于(int i=1;i<51;i++){
添加(新整数(i));
}
集合。洗牌(列表);
对于(int i=0;i<50;i++){//设置为50作为最大值,仅举个例子
}
}
}

我看到代码中有几个问题。听起来你想在一个列表中添加50个随机数。上面的代码实际上是将数字1:50(包括1:50)添加到一个列表中,然后随机调整列表中这些数字的顺序。你仍然会有非随机数(所有1:50的数字仍然在列表中,只是以随机顺序排列)

您应该做的是随机生成数字,然后将它们添加到列表中。例如:

    Random rand = new Random();
    int upperBound = 50;
    int sum = 0;
    for (int i = 0; i < 50; i++) {
        int randInt = rand.nextInt(upperBound) + 1;
        list.add(randInt);
        sum += randInt;
    }
Random rand=new Random();
int上限=50;
整数和=0;
对于(int i=0;i<50;i++){
int randInt=rand.nextInt(上限)+1;
列表。添加(randInt);
sum+=randInt;
}
因为您没有使用从1到50的随机整数。您只是将列表中的数字从1移动到50

如果您真的想要一个1-50之间的随机数列表,那么您可以使用获得如下随机数:

ArrayList<Integer> list = new ArrayList<>();
Random r = new Random();
for (int i = 1; i <= 50; i++) {
    list.add(r.nextInt(50) + 1);
}

我不确定命名约定。意思是平均吗?总数除以计数

Random random = new Random ();
int[] ia = IntStream.generate (()-> random.nextInt (50)).limit (50).toArray();
// ia wieder zu Stream machen? 
IntStream is = IntStream.of (ia);
double avg = is.summaryStatistics().getAverage()
// indeed, summaryStatistics exists.
// Expression value is: 
// IntSummaryStatistics{count=50, sum=1159, min=0, average=23,180000, max=47}
// but no stddev 

double stddev (int[] l, double avg) {
    double sum = 0.0;
    for (double d : l) {
        double xd = d - avg;
        sum += xd * xd;
    }
    return sum;
}
double std = stddev (ia, avg);
使用mapToDouble的另一种方式是:

is = IntStream.of (ia);
double qabw (int i, double avg) {
  double abw = 1.0 * i - avg;
  double q = abw * abw;
  return q;
}
DoubleStream ds = is.mapToDouble(i-> qabw (i, avg));
double qsum ds.sum ();
我对溪流的事还不太熟悉。顺便说一句,应该可以将不完整的函数stddev馈送到流中

另一方面,通过summaryStatistics().getAverage(),流被消耗并消失。因此,我必须将值存储在数组中,例如,首先,然后从数组中重新创建流

相当复杂

但是,我认为我们最终需要一个Math.sqrt来获得正确的值,和/或除以计数,因此数学部分肯定需要更正


关于使用流的改进:不客气。

IntSummaryStatistics=IntStream.rangeClosed(1,50).summaryStatistics()您没有添加“随机”数字^^仅使用从1到50的所有整数
random.nextInt(50)+1
对于随机数使用简化的for循环,您可以避免这样的注释://设置为50作为max number仅举个例子感谢你们,我完全没有意识到我在这么做。这帮了大忙!
is = IntStream.of (ia);
double qabw (int i, double avg) {
  double abw = 1.0 * i - avg;
  double q = abw * abw;
  return q;
}
DoubleStream ds = is.mapToDouble(i-> qabw (i, avg));
double qsum ds.sum ();