2017-05-05 965 views
0

我的程序允许用户选择他要掷骰子的次数,然后程序输出他得到骰子两侧的次数。Java,使用Math.random计算中位数和平均值

到目前为止一切都很好,但是我必须计算所有这些投掷骰子的中位数和平均值,我希望平均数和中位数的范围为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-loop会初始化散列表中的键1到6。

第二个for-loop计算X个掷骰子数并将它们添加到hashmap中。

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

+0

'double'或'integer'中的'Average'? –

+0

@SanketMakani双倍请平均:) – mackanmorre

回答

3

为了计算平均则可以使用以下代码:

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); 
+0

非常感谢!这是我寻找的确切逻辑类型! – mackanmorre

+0

或在一行中使用流'rolls.entrySet()。stream()。mapToDouble(e-> e.getValue()* e.getKey())。sum()/ amount;' –

+0

平均部分似乎工作现在好了。任何人有任何简单的建议来计算中位数? – mackanmorre

2

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

要计算中位数,请获得所有卷+ 1的总和并除以2 - 这是针对奇数量的卷。当存在甚至量辊放置在一有序系列的所有轧辊,采取(n-1)/2和第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; 
} 
+0

谢谢!你能否给我提供一个我如何能做到的例子。你认为我应该使用否则检查其奇数或偶数?而且我不确定如何在卷筒数量均匀的情况下将所有卷筒放置在有序的系列中。感谢您的输入:) – mackanmorre

+0

太好了。最后一个问题:我应该把它放在我的代码的末尾,还是应该放在最后一个for循环中? – mackanmorre

+0

你必须把它放在'main'方法的末尾。 – Bananan

0

为了找到中值你需要找到该骰子的面出现在第(n + 1)/ 2为奇数和以n/2和n/2 + 1为偶数。在这种情况下,这些是中位数。 因此,只需将出现在数组顶部的面朝上并找到您的中位数即可。

+0

为此提供一个示例代码! –