2017-05-05 26 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ループは、ハッシュマップのキー1から6を初期化します。

for-loopは、X個のダイススローを計算し、それらをハッシュマップに追加します。

for-loopは、ハッシュマップの値を繰り返し処理し、結果を出力します。

+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

または、1行で 'rolls.entrySet()。stream()。mapToDouble(e-> egetgetue()* e.getKey())。sum()/ amount; 'を使用してください。 –

+0

平均的な部分がうまくいくようです今は大丈夫です。誰でも中央値を計算するための簡単な提案はありますか? – mackanmorre

2

平均を計算するには、すべてのロール(rolls.entrySet()Map.Entry::getKey()Map.Entry::getValue())の合計を取得し、その量で除算するだけです。

中央値を計算するには、すべてのロールの合計+1を計算し、それを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番目とn/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における(N + 1)/ 2で現れた見つける必要があります2、n/2 + 1である。これらはこの場合の中央値です。 トップに表示されている顔を配列に保存し、中央値を見つけてください。

+0

これにサンプルコードを提供してください! –