我根本不知道我在哪里弄错了。我已经包含了整个代码。我正在尝试使百分比部分显示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 T1 HHHH4 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%)(由于最后一个值是“ T”,我需要将其设置为21)。
[2] = 2(6.7%)
[3] = 4(13.3%)
[4] = 2(6.7%)
[5] = 1(3.3%)
......
答案 0 :(得分:1)
您的代码有一些问题。无效的最终原因是最终的硬币翻转未被计算在内。
代码输出There were a total of 30 distinct runs in the simulation.
的原因是因为您以错误的值开始totalNumberOfRuns
。
totalNumberOfRuns
应该以{{1}}开头,而不是0
。
还要注意硬币翻转输出的结尾是1
,在T...
之后应该有1
。您需要将该打印语句放置在循环的末尾,否则它将仅打印前一次迭代中的数字,而根本不会在最终迭代中运行。
此外,在整个代码中,您都使用幻数。例如。 T
,if (i < 50)
。魔术数字是邪恶的,您永远不要使用它们。魔术数字为何邪恶的一个示例:如果在询问用户应将硬币翻转多少次时输入int[]runLength = new int[50]
,该怎么办?在这种情况下,代码将无法正常运行。无论您在这里没有使用幻数,这些条件语句都是毫无意义的,因为如果您为100
输入i
,50
将永远不会大于50
。
我也为您的代码样式感到不安。请即使对一行长的块也请使用花括号。至少,至少与之保持一致。在某些时候,您将花括号用于单行if语句,但是在某个位置,您不要将花括号用于单行的else语句。
此外,输出频率的打印语句非常混乱。这是使用numberOfFlips
的理想场所,特别是因为您已经在print方法内部使用了System.out.printf
。 String.format
方法很漂亮,您应该对此感到满意。这是您应该使用的:
printf
我让您的代码正常工作,并且还进行了一些清理。在复制并粘贴此解决方案之前,请您考虑一下为什么我上面的解释会修复您的代码,以及我为清理代码所做的操作(例如System.out.printf("[%d] = %d (%1.1f%%)%n", i + 1, runLength[i], percentageFreq);
不应是静态的)
您在这里:)
rng