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

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

50 Значение семени, значение 1200 RNG.

60 Значение семени, 1200 RNGЗначение.

В приведенных выше примерах (для ясности, вместо того, чтобы выписывать все это), вы можете видеть выходные данные, которые вы получаете для 50 против 60. Меня интересуют не отдельные значения.Это дисплей сейчас.Как видите, число становится больше, так как я ввел новое начальное значение.Я хочу, чтобы он отображал значение 50 начальных значений, но имел свойства любого начального значения, которое я ввел.

Если я добавлю, например, 60, я хочу получить:

H1T1 H1 T1 HHH3 TTTTT5 H1 T1 HHHH4 T1 HH2 T1 H1 T1 H1 T1 H1 T1 H1 TTT3 H1 TTT3 H1 TTTT4 H1 T1 HHH3 TT2 H1 T ... (точно так же, как с начальным значением 50).

НО этополучил бы 35 различных значений вместо 30. Дайте мне знать, если я могу быть более ясным, я прошу прощения за то, что так запутал.

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

public class CoinFlipAnalyzer{

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

     public static void main (String[] args){


         // Integer Values:

         int totalNumberOfRuns = 0;
         int run = 1;


         // Boolean Values:


         boolean theCoin;
         boolean tempVal = false;


         // Gathering the Users Input:


         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?");        
         int rngSeed = stdIn.nextInt();

         Random rng = new Random(rngSeed); // Initiates the Random Number Generator.              

         System.out.println();

         // Loop and Array to Decide Whether the Value is Heads or Tail.  

         long[] runLength = new long[numberOfFlips];        
              for (int i = 0; i < numberOfFlips; i++) {
                  theCoin = rng.nextBoolean(); // As requested, I used the nextBoolean expression.
                  if (theCoin != tempVal) {
                     if (i > 0) {
                        System.out.print(run + " ");
                     }
                        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("...");         
          System.out.println();

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

1 Ответ

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

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

Существует StringUtils от Apache Commons , который имеет метод «Сокращения».

public static String abbreviate(String str, int maxWidth)

Сокращает строку, используя эллипсы. Это превратит «Сейчас настало время для всех хороших людей» в «Сейчас настало время для ...»

Чтобы использовать это (или другое предложение ниже), я бы удалил непосредственный вывод, генерируемый в прогоне, и вместо этого построил String. Можно также построить char[], но здесь мы пойдем с String (или StringBuilder). Это дает еще одно преимущество - как правило, рекомендуется отделять часть логики от выходных данных. Плюс это было бы более проверяемым.

Итак, если можно использовать StringUtils.abbreviate(...), тогда возьмите результат из doFlips(...) и передайте его методу, и результат будет готов.

/*
 * moved the flipping into a method; allow it to build the
 *  results rather than immediately outputting them
*/
private static StringBuilder doFlips(int numberOfFlips, Random rng)
{
    long[] runLength = new long[numberOfFlips];
    boolean theCoin;
    boolean tempVal = false;

    int run = 1;
    int totalNumberOfRuns = 0;

    // Here we will collect the output; use better name in production
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < numberOfFlips; i++) {
        theCoin = rng.nextBoolean(); // As requested, I used the nextBoolean
                                     // expression.
        if (theCoin != tempVal) {
            if (i > 0) {
                sb.append(run);
                sb.append(" ");
            }
            runLength[run - 1]++;
            totalNumberOfRuns++;
            run = 1;
        }
        else {
            run++;
        }
        if (theCoin) {
            sb.append("H");
            tempVal = true;
        }
        else {
            sb.append("T");
            tempVal = false;
        }
    }

    return sb;
}

Если вы не можете использовать библиотеку, достаточно просто написать chop метод:

/**
 * Chop the input StringBuilder and give "..." at
 * maxOutput.
 * 
 * NOTE: no error checking
 */
private static String ourChop(StringBuilder sb, int maxOutput)
{
    if (sb.length() <= maxOutput) {
        return sb.toString();
    }

    // we chop everything past maxOutput - 3
    sb.setLength(maxOutput - 3);
    sb.append("...");

    return sb.toString();
}

Итак, мы можем сделать следующее:

public static void main(String[] args)
{
    int seed = 1200;
    int maxOutput = 25;

    // 50 flips, 25 length max, including ... if needed
    StringBuilder res = doFlips(50, new Random(seed));
    System.out.println(ourChop(res, maxOutput));

    res = doFlips(60, new Random(seed));
    System.out.println(ourChop(res, maxOutput));

И мы получаем этот вывод (в 25):

H1 T1 H1 T1 HHH3 TTTTT...
H1 T1 H1 T1 HHH3 TTTTT...

Теперь, если цель состоит в том, чтобы выровнять по максимальному выходу некоторого данного прогона, тогда нужно будет собрать все прогоны (50, 60 и т. Д.), А затем найти конкретное значение (скажем, самое короткое из выходы; обратите внимание, что в теории в действительно случайной ситуации 60 может иметь более короткий выход, чем 50, но не при использовании одного и того же начального числа) Затем можно использовать это определенное значение, чтобы нарезать до заданной выходной длины.

Если я неправильно понял подход, прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...