繁体   English   中英

随机数均值和标准差Java

[英]Random numbers mean and standard deviation Java

因此,我有一个程序,该程序具有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
        }
    }
}

我在代码中看到了几个问题。 听起来您正在尝试将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;
    }

正如@azro所提到的,您没有使用1到50之间的随机整数。您只是在列表中将数字从1改到50。

如果您确实想要1-50的随机数列表,则可以使用Random::nextInt来获得如下所示的随机数:

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

甚至在Java 8中使用Random::ints更容易:

List<Integer> list = new Random().ints(50,1,51) // generate 50 random numbers from 1 inclusive to 51 exclusive
        .boxed()                                // box each int
        .collect(Collectors.toList());          // get a list with the numbers

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

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来获取正确的值和/或除以计数,因此数学部分肯定需要进行校正。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM