Есть несколько проблем с вашим кодом. Основная причина, по которой он не работает, заключается в том, что последний бросок монеты не учитывается.
Причина, по которой ваш код выводит 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);
}
}
}
}