Массив работает, но не дает правильных значений при компиляции? - PullRequest
0 голосов
/ 17 ноября 2018

Я просто не знаю, где я ошибаюсь.Я включил весь код.Я пытаюсь получить процентную часть для отображения 30 различных значений, но он продолжает отображать 29. Есть ли простое исправление к этому, и я делаю это слишком сложным?

private static final Scanner
   stdIn = new Scanner(System.in);

   private static Random 
   rng;


   public static void main (String[] args){

    long
       rngSeed;

    int
       numberOfFlips,
       totalNumberOfRuns = 1,
       run = 0;


     boolean
       theCoin,
       tempVal = false;

   System.out.println("Welcome to the coin flip analyzer.\n" +
    "How many flips?");
   numberOfFlips = stdIn.nextInt();
   System.out.println("What do you want to seed the random number generator with?");
   rngSeed = stdIn.nextLong();

   int[]runLength = new int[50];
   rng = new Random(rngSeed);

   for (int i = 0; i < numberOfFlips; i++) {
       theCoin = rng.nextBoolean();
       if (i > 0 && theCoin != tempVal) {
          if (i < 50) {
              System.out.print(run + " ");
         }
          runLength[run - 1]++;
          totalNumberOfRuns++;
          run = 1;
      }
       else
           run++;
       if (theCoin) {
           if (i < 50) {
               System.out.print("H");
           }
           tempVal = true;
       }
       else {
           if (i < 50) {
               System.out.print("T");
           }
           tempVal = false;
       }
   }


   System.out.print("...");
   System.out.println();

   System.out.println("There were a total of " + totalNumberOfRuns +
    " distinct runs in the simulation.\nTheir breakdown follows.");


   // run length table header line

    System.out.println("[run length] = # (as percentage of all runs)");

   // your code to display the count and frequency percentage of each run length
   // should follow

    for (int i = 0; i < runLength.length; i++) {
        double percentageFreq = ((double) + (runLength[i]) / (totalNumberOfRuns) * 100);
        if (runLength[i] > 0)
            System.out.println("[" + (i+1) + "] = " + runLength[i] + " (" + String.format("%1.1f", percentageFreq) + " %)");
            }   
      }
}

...............

Самая важная часть результата Использование: 50 сальто и случайное начальное значение 1200.

H1 T1 H1 T1 HHH3 TTTTT5 H1 T1HHHH4 T1 HH2 T1 H1 T1 H1 T1 H1 T1 H1 TTT3 H1 TTT3 H1 TTTT4 H1 T1 HHH3 TT2 H1 T ...

Всего в симуляции было 30 различных прогонов.

Ниже приводится их разбивка.

  • [длина пробега] = # (в процентах от всех пробежек)

  • [1] = 20 (66,7%) (Мне нужно, чтобы это было 21, поскольку последнее значение - «Т»).

  • [2] = 2 (6,7%)

  • [3] = 4 (13,3%)

  • [4] = 2 (6,7%)

  • [5] = 1 (3,3%)

...............

1 Ответ

0 голосов
/ 17 ноября 2018

Есть несколько проблем с вашим кодом. Основная причина, по которой он не работает, заключается в том, что последний бросок монеты не учитывается.

Причина, по которой ваш код выводит There were a total of 30 distinct runs in the simulation., заключается в том, что вы запускаете totalNumberOfRuns с неправильного значения.

totalNumberOfRuns должно начинаться с 0, а не 1.

Также обратите внимание, как конец вывода для бросков монеты равен T..., после T должен быть 1. Вам нужно поместить этот оператор print в конце цикла, иначе он будет печатать только число из предыдущей итерации и просто не будет выполняться вообще для последней итерации.

Кроме того, во всем вашем коде вы используете магические числа. Например. if (i < 50), int[]runLength = new int[50]. Магические числа являются злом, и вы никогда не должны их использовать. Пример того, почему магические числа являются злыми: что если пользователь вводит 100, когда его спрашивают, сколько раз монета должна быть подброшена? В этом случае код не будет работать должным образом. В любом случае, даже если вы не использовали здесь магическое число, эти условные выражения не имеют смысла, поскольку i никогда не будет больше 50, если вы введете 50 для numberOfFlips.

Я также немного обеспокоен стилем вашего кода. Пожалуйста, пожалуйста, используйте фигурные скобки даже для блоков длиной в одну строку. По крайней мере, по крайней мере, согласиться с этим. В некоторых местах вы используете фигурные скобки для однострочных операторов if, но в одном месте вы не используете фигурные скобки для однострочных операторов else.

Кроме того, ваши операторы печати, в которых вы выводите частоты, очень грязные. Это идеальное место для использования System.out.printf, тем более что вы уже используете String.format внутри метода печати. Метод printf - прекрасная вещь, и вы должны освоиться с ним. Вот что вы должны использовать:

System.out.printf("[%d] = %d (%1.1f%%)%n", i + 1, runLength[i], percentageFreq);

Я заставил ваш код работать, и я тоже немного его почистил. Прежде чем копировать и вставлять это решение, я умоляю вас подумать о том, почему мое объяснение выше исправит ваш код, а также то, что я сделал для очистки вашего кода (например, rng не должно быть статичным)

Вот, пожалуйста:)

public class Main {
private static final Scanner stdIn = new Scanner(System.in);

public static void main(String[] args) {

    int totalNumberOfRuns = 0;
    int run = 1;
    boolean theCoin, tempVal = false;

    System.out.println("Welcome to the coin flip analyzer.\n"
            + "How many flips?");
    int numberOfFlips = stdIn.nextInt();
    System.out
            .println("What do you want to seed the random number generator with?");
    long rngSeed = stdIn.nextLong();
    Random rng = new Random(rngSeed);
    int[] runLength = new int[numberOfFlips];

    for (int i = 0; i < numberOfFlips; i++) {
        theCoin = rng.nextBoolean();
        if (theCoin != tempVal) {
            runLength[run - 1]++;
            totalNumberOfRuns++;
            run = 1;
        } else {
            run++;
        }
        if (theCoin) {
            System.out.print("H");
            tempVal = true;
        } else {
            System.out.print("T");
            tempVal = false;
        }
        System.out.print(run + " ");
    }

    System.out.print("...");
    System.out.println();

    System.out
            .println("There were a total of "
                    + totalNumberOfRuns
                    + " distinct runs in the simulation.\nTheir breakdown follows.");

    // run length table header line

    System.out.println("[run length] = # (as percentage of all runs)");

    // your code to display the count and frequency percentage of each run
    // length
    // should follow

    for (int i = 0; i < runLength.length; i++) {
        double percentageFreq = ((double) +(runLength[i])
                / (totalNumberOfRuns) * 100);
        if (runLength[i] > 0) {
            System.out.printf("[%d] = %d (%1.1f%%)%n", i + 1, runLength[i],
                    percentageFreq);
        }
    }
}
}
...