【问题标题】:Java, calculation of median and average when using Math.randomJava,使用 Math.random 计算中位数和平均值
【发布时间】:2017-10-03 15:59:36
【问题描述】:

我的程序让用户选择他想掷骰子的次数,然后程序打印出他得到骰子每一面的次数。

到目前为止一切都很好,但是我必须计算所有这些掷骰子的中位数和平均值,并且我希望平均值和中位数的范围在 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 中的值并打印出结果。

【问题讨论】:

  • Average in doubleinteger?
  • @SanketMakani 请平均双倍:)

标签: java hashmap average median calculation


【解决方案1】:

为了计算平均值,您可以使用以下代码:

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

average = total/amount;
System.out.println("Average : "+average);

【讨论】:

  • 非常感谢!这正是我正在寻找的逻辑类型!
  • 或者在一行中使用流rolls.entrySet().stream().mapToDouble(e-&gt;e.getValue()*e.getKey()).sum()/amount;
  • 平均部分现在似乎工作正常。任何人有任何简单的建议来计算中位数?
【解决方案2】:

要计算平均值,您只需将所有卷的总和(rolls.entrySet()Map.Entry::getKey()Map.Entry::getValue())除以它的数量。

要计算中位数,请获取所有卷的总和 + 1 并将其除以 2 - 这是奇数卷。当卷数为偶数时,将所有卷按顺序排列,取(n-1)/2-th 和n/2-th 元素并除以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-th 元素。

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;
}

【讨论】:

  • 谢谢!你能给我举个例子来说明我如何做到这一点。你认为我应该使用 if else 来检查它是奇数还是偶数?而且我不确定当卷的数量均匀时我应该如何将所有卷放置在有序系列中。不过感谢您的输入:)
  • 太棒了。最后一个问题:我应该把它放在我的代码末尾,还是应该把它放在你开始的最后一个 for 循环中?
  • 你必须把它放在你的 main 方法的末尾。
  • 好的,唯一的问题是你的 foo 循环中的变量 i 从未被赋值
  • 它应该被命名为 count - 我已经修复了 - for (int count = entry.getValue(); count &gt; 0; count--) {
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 2021-03-03
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多