所以我有一个程序,它有一个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
}
}
}
答案 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来获得正确的值,和/或按计数除法,因此数学部分需要进行校正。
有关使用流的改进:欢迎您。