Использование данных в массивах для создания гистограммы частоты значений матрицы - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь создать программу, которая позволит вам выбрать:

  • количество костей, которые вы бросите (минимум 1, без ограничений)
  • количествостороны на кости (от 3 до 10 включительно)
  • сколько раз вы будете бросать кости (по крайней мере, 1, без ограничений)

Затем подсчитывается числораз каждое значение появляется и отображает эту информацию на гистограмме, причем ось X - это значения, которые появились в бросках, а ось Y - частота каждого значения.

Пока у меня есть все, кромегистограмма, я никогда не пробовал делать диаграммы на любом языке, так что это совершенно новое для меняЯ смотрел на библиотеку JFreechart, но не смог заставить ее работать, поскольку она не позволяла мне изменять ссылки на оси x и y.Должен ли я даже использовать эту библиотеку или есть более простой способ сделать это?

Это то, что у меня есть:

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

public class Main {

    public static void main(String[] args) {
        int numDice = 0;    //Numero de dados
        int numSides = 0;   //Numero de lados en dados
        int numThrows = 0;  //Numero de tiros
        int i, temp = 0;
        Scanner cap = new Scanner(System.in);
        Random random = new Random();   //Libreria Random para valores de dados

        while (numDice < 1) {
            System.out.println("Introduce number of dice that will be used...");
            numDice = cap.nextInt();
            if (numDice < 1) {
                System.out.println("Number of dice must be 1 or higher");
            }
        }   //Define numero de dados, condicional (debe ser por lo menos 1)

        while (numSides < 3 || numSides > 10)   //Define numero de lados por dado, condicional (debe ser por lo menos 3, maximo 10)
        {
            System.out.println("Introduce number of sides on each die...");
            numSides = cap.nextInt();
            if (numSides < 3 || numSides > 10) {
                System.out.println("Number of sides must between 3 and 10");
            }
        }

        while (numThrows < 1) {
            System.out.println("Introduce number of throws of dice...");
            numThrows = cap.nextInt();
            if (numThrows < 1) {
                System.out.println("Number of throws must be 1 or higher");
            }
        }   //Define numero de tiros, condicional (debe ser por lo menos 1)


        int[] allNum = new int[numThrows * numDice];
        int[] count = new int[10];

        for (int z = 0; z < numThrows * numDice; z++) {

            int randomInt = random.nextInt(numSides + 1);   //Se consigue un valor random entre 0 y el numero de lados (+ 1 porque random.nextInt es exclusivo entonces
            while (randomInt == 0) {
                randomInt = random.nextInt(numSides + 1);   //Como no es valido el valor de 0 en un dado, si se consigue, se reevalua hasta conseguir un valor no igual a cero para consideracion
            }
            allNum[z] = randomInt;                                 //El valor entre el rango se guarda en el arreglo valDice (este arreglo se re-escribe en otras tiradas)
            if (z % numDice == 0) {
                System.out.println("Tiro " + ((z / numDice) + 1) + "...");
            }
            System.out.println("Valor de dado " + (z + 1) + " = " + allNum[z]);  //Se imprimen los valores actuales de los dados por indice
        }
        for (i = 0; i < allNum.length; i++) {                       //count[] contiene diez ceros, este for loop checa cuantas veces sale cada numero y le suma 1 cada vez
            temp = allNum[i];                                       //el valor de temp se va cambiando a cada valor que esta dentro de allNum[i]
            count[temp]++;                                          //temp se usa como indice en count y se incrementa el valor en esa posicion
        }

        for (i = 1; i < count.length; i++) {                        //se imprime la informacion, revisando cuantas veces ocurre cada numero

            if (count[i] == 1) {
                System.out.printf("%d ocurre %d vez\n", i, count[i]);   //Si ocurre una vez, solo dice "vez"
            } else if (count[i] >= 2) {
                System.out.printf("%d occure %d veces\n", i, count[i]); //De lo contrario, dice "veces"
            }
        }
    }
}

Комментарии на испанском языке, но основной поток:

  • Инициализация переменных
  • Захват количества костей, сторон и количества бросков
  • Массив с именем allNum, в котором хранятся все значения, которые будут брошены (размер равен числу бросков, умноженных на количество костей)
  • Массив именованных счетчиков, которыйбудет иметь десять нулей, которые будут увеличиваться при каждом обнаружении вхождения
  • Начать получать случайные числа между 0 и числом выбранных сторон (если 0, он «перекатывается», пока не будет 0 для этого значения)и сохраняет их в allNum []
  • Небольшой цикл для вывода «Throw» + index »каждый раз, когда модуль между index и numDice равен 0, чтобы указать начало нового броска
  • .фактическая проверка вхождений с использованием «temp» в качестве индекса в count [] и увеличение значения этого индекса на 1
  • Выведите число, которое появилось в броске, и сколько раз оно появилось (говоря «время», еслитолько наce, «times», если кратно)

Я хотел бы, чтобы эта информация, которая печатается, была представлена ​​в виде гистограммы, где значения X - это каждое появившееся число, а значения Y - эточастота каждого значения.

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

...