Гистограмма броска костей

У меня есть классный вопрос, логику которого я не могу понять.

Измените приведенную ниже программу, чтобы напечатать гистограмму, в которой общее количество бросков игральных костей равно каждому возможному значению, отображаемому путем печати символа, например *, это количество раз, как показано ниже.

Гистограмма, показывающая общее количество бросков костей для каждого возможного значения.

Гистограмма броска костей:

2:  ******
3:  ****
4:  ***
5:  ********
6:  *******************
7:  *************
8:  *************
9:  **************
10: ***********
11: *****
12: ****

Я не понимаю, что в мире показывает эта гистограмма. Это сводит меня с ума, и я не могу двигаться вперед со своей логикой, если не понимаю, что делаю. Я знаю, что этот вопрос задавался раньше, но похоже, что у всех у них есть определенное количество ролей в костях, от которых они уходят. Мне не дают номер, и это то, что сбивает меня с толку. Я знаю, что это действительно глупый вопрос. Но может ли кто-нибудь объяснить мне, что они подразумевают под «гистограммой, показывающей общее количество бросков костей для каждого возможного значения», что определяет это возможное значение? Я в полной растерянности... Любая помощь приветствуется. Вот код, который я написал до сих пор.

import java.util.Scanner;
import java.util.Random;

public class DiceStats {

   public static void main(String[] args) {

      Scanner scnr = new Scanner(System.in);

      Random randGen = new Random();

      int i = 0;            // Loop counter iterates numRolls times

      int numRolls = 0;     // User defined number of rolls

      int numOnes = 0;      // Tracks number of 1's found
      int numTwos = 0;      // Tracks number of 2's found
      int numThrees = 0;    // Tracks number of 3's found
      int numFours = 0;     // Tracks number of 4's found
      int numFives = 0;     // Tracks number of 5's found
      int numSixes = 0;     // Tracks number of 6's found
      int numSevens = 0;    // Tracks number of 7's found
      int numEights = 0;    // Tracks number of 8's found
      int numNines = 0;     // Tracks number of 9's found
      int numTens = 0;      // Tracks number of 10's found
      int numElevens = 0;   // Tracks number of 11's found
      int numTwelves = 0;   // Tracks number of 12's found

      int die1 = 0;         // Dice values
      int die2 = 0;         // Dice values

      int rollTotal = 0;    // Sum of dice values

      System.out.println("Enter number of rolls: ");

      numRolls = scnr.nextInt();

      if (numRolls >= 1) {
         // Roll dice numRoll times
         for (i = 0; i < numRolls; ++i) {
            die1 = randGen.nextInt(6) + 1;
            die2 = randGen.nextInt(6) + 1;
            rollTotal = die1 + die2;

            // Count number of sixes and sevens
            if (rollTotal == 1) {
                numOnes = numOnes + 1;
            }

            if (rollTotal == 2) {
                numTwos = numTwos + 1;
            }

            if (rollTotal == 3) {
                numThrees = numThrees + 1;
            }

            if (rollTotal == 4) {
                numFours = numFours + 1;
            }

            if (rollTotal == 5) {
                numFives = numFives + 1;
            }

            if (rollTotal == 6) {
               numSixes = numSixes + 1;
            }

            if (rollTotal == 7) {
               numSevens = numSevens + 1;
            }


            if (rollTotal == 8) {
               numEights = numEights + 1;
            }


            if (rollTotal == 9) {
               numNines = numNines + 1;
            }

            if (rollTotal == 10) {
               numTens = numTens + 1;
            }

            if (rollTotal == 11) {
               numElevens = numElevens + 1;
            }

            else if (rollTotal == 12) {
               numTwelves = numTwelves + 1;
            }

            System.out.println("Roll " + (i+1) + " is " + rollTotal + " (" + die1 + 
                  "+" + die2 + ")");

         }

         // Prints a histogram of the number of dice rolls
         System.out.println("\nDice roll histogram:");
         System.out.println("1's: " + numOnes);
         System.out.println("2's: " + numTwos);
         System.out.println("3's: " + numThrees);
         System.out.println("4's: " + numFours);
         System.out.println("5's: " + numFives);
         System.out.println("6's: " + numSixes);
         System.out.println("7's: " + numSevens);
         System.out.println("8's: " + numEights);
         System.out.println("9's: " + numNines);
         System.out.println("10's: " + numTens);
         System.out.println("11's: " + numElevens);
         System.out.println("12's: " + numTwelves);
      }
      else {
         System.out.println("Invalid rolls. Try again.");
      }

     return;
   }
}

Вы можете видеть, где я ввел запись для гистограмм. Я в основном думал, что мне нужно отредактировать мое значение, заданное целыми числами, такими как «numOnes», звездочкой, но теперь я не уверен ... любая помощь приветствуется!

ИЗМЕНЕННЫЙ КОД -

System.out.println("\nDice roll histogram:");


     System.out.print("2's: ");
     for(i = 0; i < numTwos; i++){
         System.out.print("*");
     }
     System.out.println("");

     System.out.print("3's: ");
     for (i = 0; i < numThrees; i++);{
         System.out.print("*");
     }
     System.out.println("");

     System.out.print("4's: " );
     for (i = 0; i < numFours; i++);{
         System.out.print("*");
     }
     System.out.println("");

     System.out.print("5's: ");
     for (i = 0; i < numFives; i++);{
         System.out.print("*");
     }
     System.out.println("");

     System.out.print("6's: ");
     for (i = 0; i < numSixes; i++);{
         System.out.print("*");
     }
     System.out.println("");

     System.out.print("7's: ");
     for (i = 0; i < numSevens; i++);{
         System.out.print("*");
     }
     System.out.println("");

     System.out.print("8's: ");
     for (i = 0; i < numEights; i++);{
         System.out.print("*");
     }
     System.out.println("");

     System.out.print("9's: ");
     for (i = 0; i < numNines; i++);{
         System.out.print("*");
     }
     System.out.println("");

     System.out.print("10's: ");
     for (i = 0; i < numTens; i++);{
         System.out.print("*");
     }
     System.out.println("");

     System.out.print("11's: ");
     for (i = 0; i < numElevens; i++);{
         System.out.print("*");
     }
     System.out.println("");

     System.out.print("12's: ");
     for (i = 0; i < numTwelves; i++);{
         System.out.print("*");
     }
     System.out.println("");

  }

ВЫХОДЫ -

Enter number of rolls: 
5
Roll 1 is 8 (2+6)
Roll 2 is 9 (6+3)
Roll 3 is 9 (5+4)
Roll 4 is 6 (4+2)
Roll 5 is 9 (6+3)

Dice roll histogram:
2's: 
3's: *
4's: *
5's: *
6's: *
7's: *
8's: *
9's: *
10's: *
11's: *
12's: *

Я могу ввести большее количество бросков, и я получу звездочку за двойки, и она будет увеличиваться, как мне нужно, но не увеличивает остальные числа, и все они получают только одну звездочку. Что мешает моему коду правильно увеличить количество *? Я боролся с этим часами :/


person Eternal Vapor    schedule 28.02.2015    source источник
comment
Позвольте представить вам друга, это массивы вызовов, см. след массивов для более подробной информации, они сделают вашу жизнь НАМНОГО проще...   -  person MadProgrammer    schedule 28.02.2015
comment
@MadProgrammer позвольте мне разобраться в этом. Благодарю вас! Все, что упростит этот беспорядочный беспорядок ада, будет огромной помощью!   -  person Eternal Vapor    schedule 28.02.2015


Ответы (2)


«Я не понимаю, что, черт возьми, показывает эта гистограмма».

Ну, как ты сказал:

«Гистограмма, показывающая общее количество бросков костей для каждого возможного значения»

Гистограмма:

2:  ****** 
3:  **** 
4:  *** 
5:  ******** 
6:  ******************* 
7:  ************* 
8:  ************* 
9:  ************** 
10: *********** 
11: ***** 
12: ****

представляет собой запись бросков пары шестигранных игральных костей. Возможные значения суммы пары игральных костей варьируются от 2 до 12. Если вы бросите их 100 раз, они могут дать такие результаты.

Эта гистограмма показывает, что значение 6 выпадало чаще всего (19 раз), а значение 4 — реже всего (3 раза). Если бы вы подсчитали каждый *, вы бы узнали, сколько раз бросались кости.

Вы можете подумать, что гистограмма должна выглядеть так:

введите здесь описание изображения

Но поверни это боком:

введите здесь описание изображения

и представьте, что синие столбцы — это *, метка 100 - 150 — это 2, а метка 150 - 200 — это 3, тогда она начинает выглядеть как ваша гистограмма.

Любая форма представляет собой гистограмму. Они позволяют сравнивать количество (сколько) вещей, которые относятся к разным категориям (видам) вещей.

Графическую диаграмму трудно вывести из программы, основанной на тексте, поэтому вместо этого она просит вас отобразить то, что в основном представляет собой искусство ascii:

введите здесь описание изображения

Если бы это было в текстовом файле, а не в программном выводе, это также можно было бы считать формой подсчета. Вы можете легко добавлять новые * по мере получения новых данных. Это тот же трюк, что и этот:

введите здесь описание изображения

Надеюсь, это имеет больше смысла.

ПРЕДУПРЕЖДЕНИЕ, СПОЙЛЕР: Если это помогло, и вы хотели бы попробовать изменить программу самостоятельно, не читайте дальше. В противном случае...

Этот

     System.out.println("\nDice roll histogram:");
     System.out.println(" 1's: " + nManyStars(numOnes));
     System.out.println(" 2's: " + nManyStars(numTwos));
     System.out.println(" 3's: " + nManyStars(numThrees));
     System.out.println(" 4's: " + nManyStars(numFours));
     System.out.println(" 5's: " + nManyStars(numFives));
     System.out.println(" 6's: " + nManyStars(numSixes));
     System.out.println(" 7's: " + nManyStars(numSevens));
     System.out.println(" 8's: " + nManyStars(numEights));
     System.out.println(" 9's: " + nManyStars(numNines));
     System.out.println("10's: " + nManyStars(numTens));
     System.out.println("11's: " + nManyStars(numElevens));
     System.out.println("12's: " + nManyStars(numTwelves));

и это

   static String nManyStarsOld(int n) {
       String result = "";

       for (int i = 0; i < n; i++) {
           result += "*";
       }

       return result;
   } 

должен, если его уронить в нужных местах, заставить вашу программу перестать печатать то, что она печатает сейчас, а именно:

Enter number of rolls: 
20
Roll 1 is 5 (2+3)
Roll 2 is 10 (4+6)
Roll 3 is 7 (5+2)
Roll 4 is 7 (5+2)
Roll 5 is 5 (1+4)
Roll 6 is 11 (6+5)
Roll 7 is 8 (3+5)
Roll 8 is 8 (2+6)
Roll 9 is 7 (1+6)
Roll 10 is 8 (3+5)
Roll 11 is 12 (6+6)
Roll 12 is 6 (2+4)
Roll 13 is 8 (6+2)
Roll 14 is 8 (4+4)
Roll 15 is 7 (1+6)
Roll 16 is 4 (2+2)
Roll 17 is 6 (5+1)
Roll 18 is 7 (6+1)
Roll 19 is 6 (1+5)
Roll 20 is 5 (1+4)

Dice roll histogram:
1's: 0
2's: 0
3's: 0
4's: 1
5's: 3
6's: 3
7's: 5
8's: 5
9's: 0
10's: 1
11's: 1
12's: 1

И вместо этого заставьте его напечатать это:

Dice roll histogram:
 1's: 
 2's: 
 3's: 
 4's: *
 5's: ***
 6's: ***
 7's: *****
 8's: *****
 9's: 
10's: *
11's: *
12's: *

В следующий раз, когда вы зададите вопрос, пожалуйста, укажите текущий результат вместе с ожидаемым результатом.

Если вам хочется быть умным, на самом деле есть однострочная версия nManyStars():

   static String nManyStars(int n) {
       return new String(new char[n]).replace("\0", "*");
   }

Вдохновленный этим: https://stackoverflow.com/a/4903603/1493294

Кроме того, если у вас есть хотя бы Java 11, вы можете обменять nManyStars(n) на "*".repeat(n).

Надеюсь, поможет

person candied_orange    schedule 28.02.2015

У Ив все заработало. Спасибо @CandiedOrange и @MadProgrammer за помощь и руководство! Обнаружил, что мой код гистограммы был перепутан с моими операторами for, имеющими ; в неправильном месте, из-за чего мой оператор for не применял * на основе его процесса выполнения оператора for, и он просто печатал * как обычную функцию печати. Все хорошо. Спасибо за помощь!

person Eternal Vapor    schedule 28.02.2015