2017-05-05 5 views
0

Mon programme permet à l'utilisateur de choisir combien de fois il veut lancer les dés, puis le programme affiche combien de fois il a obtenu chaque côté des dés. Jusqu'à présent, tout est bon, mais ensuite je dois calculer la médiane et la moyenne de tous ces dés lancés, et je veux que la moyenne et la médiane varient de 1 à 6, ce qui correspond au nombre de faces d'un dé. - comment je fais ça?Java, calcul de la médiane et moyenne lors de l'utilisation de Math.random

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

La première boucle for-initialise les clés 1 à 6 dans la table de hachage.

La deuxième boucle for-calc X nombre de lancements de dés et les ajoute à la hashmap.

La troisième boucle fortionnelle parcourt les valeurs de la table de hachage et imprime les résultats.

+0

'Average' dans' double' ou 'integer'? –

+0

@SanketMakani Moyenne en double s'il vous plaît :) – mackanmorre

Répondre

3

Pour moyenne calcul, vous pouvez utiliser ci-dessous le code:

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

Merci beaucoup! C'était le type exact de logique que je cherchais! – mackanmorre

+0

Ou en une ligne utilisant les flux 'rolls.entrySet(). Stream(). MapToDouble (e-> e.getValue() * e.getKey()). Sum()/amount;' –

+0

La partie moyenne semble fonctionner bien maintenant. Quelqu'un at-il une suggestion facile de calculer la médiane? – mackanmorre

2

Pour calculer la moyenne, il vous suffit d'obtenir la somme de tous les jets (rolls.entrySet(), Map.Entry::getKey(), Map.Entry::getValue()) et divisez-le par sa quantité.

Pour calculer la médiane, obtenez la somme de tous les jets + 1 et divisez-la par 2 - c'est pour une quantité impaire de jets. Quand il y a même quantité de rouleaux placer tous les rouleaux dans une série ordonnée, prendre (n-1)/2 -ème et n/2 éléments -ème et diviser par 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; 
} 

Une solution plus pour calculer la médiane pour nombre impair de rouleaux est de prendre seulement (n-1)/2 -ième élément de la série.

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

Thanks! Pourriez-vous me donner un exemple de la façon dont je peux faire cela? Pensez-vous que je devrais utiliser sinon si pour vérifier si c'est impair ou même? Et je ne suis pas sûr de savoir comment placer tous les jets dans une série ordonnée quand le nombre de jets est pair. Merci pour la contribution si :) – mackanmorre

+0

Great. Une dernière question: Devrais-je mettre ceci à la fin de mon code, ou devrais-je le mettre dans la dernière boucle pour laquelle vous avez commencé? – mackanmorre

+0

Vous devez le mettre à la fin de votre méthode 'main'. – Bananan

0

Pour trouver la médiane dont vous avez besoin pour trouver le visage des dés est apparu à (n + 1)/2 pour impair et à n/2 et n/2 + 1 pour pair. Ce sont les médianes dans ce cas. Il suffit donc de stocker les faces qui apparaissent en haut dans un tableau et de trouver votre médiane.

+0

Fournissez un exemple de code pour ceci! –