2017-05-05 48 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

爲此提供一個示例代碼! –