随机数表示和标准差Java

时间:2018-02-20 19:59:05

标签: 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 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
        }
    }
}

3 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:1)

作为@azro mentioned,你没有使用从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

答案 2 :(得分:0)

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

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(即btw。)不完整地提供给流。

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

非常复杂。

但是,我认为我们最终需要一个Math.sqrt来获得正确的值,和/或按计数除法,因此数学部分需要进行校正。

有关使用流的改进:欢迎您。