Java,使用Math.random时计算中位数和平均值

时间:2017-05-05 08:44:21

标签: java hashmap average median calculation

我的程序允许用户选择他想掷骰子的次数,然后程序打印出他骰子每一侧的次数。

到目前为止一切都很好,但是我必须计算所有这些掷骰子的中位数和平均值,我希望平均值和中位数的范围从1-6对应于骰子的数量 - 我该怎么做?

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class Uppgift4_5 
{
    public static void main(String[] args) 
    {
        Scanner inputReader = new Scanner(System.in);
        System.out.println("How many times do you want to throw the dice:");
        int amount = inputReader.nextInt();
        System.out.println("Antal försök:" + amount);

        Map<Integer, Integer> rolls = new HashMap<>();

        for (int i = 1; i < 7; i++) 
        {
            rolls.put(i, 0);
        }

        for (int i = 0; i < amount; i++) 
        {
            int value = (int) (Math.random() * 6 + 1);
            rolls.put(value, rolls.get(value) + 1);
        }

        for (Map.Entry<Integer, Integer> entry : rolls.entrySet()) 
        {
            System.out.println(("Antal kast som gav "+entry.getKey()) + ": " + entry.getValue());
        }
    }
}

第一个for循环在hashmap中初始化键1到6。

第二个for循环计算X数量的掷骰子并将它们添加到散列图中。

第三个for循环迭代遍历hashmap中的值并打印出结果。

2 个答案:

答案 0 :(得分:2)

要计算平均值,您只需得到所有掷骰的总和(rolls.entrySet()Map.Entry::getKey()Map.Entry::getValue())并将其除以其数量。

计算中位数得到所有卷的总和+ 1并除以2 - 这是奇数卷的数量。当有均匀数量的卷将所有卷放入有序序列中时,取(n-1)/2 - th和n/2 - 元素并除以2。

List<Integer> series = new ArrayList<>();
for (Map.Entry<Integer, Integer> entry : rolls.entrySet()) {
    for (int count = entry.getValue(); count > 0; count--) {
        series.add(entry.getKey());
    }
}
double median = 0;
if (series.size() % 2 == 0) {
    int sum = 0;
    for (int element : series) {
        sum += x;
    }
    median = sum / 2;
} else {
    Collections.sort(series);
    median = (series.get((series.size() - 1) / 2) + series.get(series.size() / 2)) / 2;
}

计算奇数卷的中位数的另一个解决方案是仅从系列中获取(n-1)/2个元素。

double median = 0;
Collections.sort(series)
if (series.size() % 2 == 0) {
    median = series.get((series.size() - 1) / 2);
} else {
    median = (series.get((series.size() - 1) / 2) + series.get(series.size() / 2)) / 2;
}

答案 1 :(得分:0)

为了找到中位数,你需要找到骰子的哪个面出现在(n + 1)/ 2为奇数和n / 2和n / 2 + 1为偶数。在这种情况下,这些是中位数。 因此,只需将出现在顶部的面部存储在一个数组中,然后找到中位数。