我正在为Java的艺术与科学教材做练习。我做了一个练习,要求我对抛硬币的模拟程序进行编程,直到连续3个“头”结果出现。
我做到了,但是我不确定我的代码是否足够简单--因为我使用一个实例变量来计数头和一个函数,它不仅可以翻转硬币,还可以计算连续的头。
我避免在run方法中放置太多行(因为im使用acm库,这是主要的方法),但我不确定这是否是最有效的编码。
下面是代码:
import acm.program.*;
import acm.util.*;
public class ConsecutiveHeads extends ConsoleProgram {
private static final int CONSECUTIVE_HEADS_LIM = 3;
public void run () {
int nFlips = 0;
while (nConsecutiveHeads < CONSECUTIVE_HEADS_LIM) {
flipCoin();
nFlips++;
}
println ("You needed " + nFlips + " flips to get " + CONSECUTIVE_HEADS_LIM + " Consecutive Heads.");
}
private void flipCoin () {
String coinFace = rgen.nextBoolean() ? "Heads" : "Tails";
if (coinFace.equals("Heads")) {
nConsecutiveHeads++;
} else if (coinFace.equals("Tails")){
nConsecutiveHeads = 0;
}
println (coinFace);
}
private int nConsecutiveHeads = 0;
private RandomGenerator rgen = RandomGenerator.getInstance();
}发布于 2013-04-14 05:03:49
我真正突出的一点是:您不需要将nextBoolean()的布尔值结果转换为可读的字符串,然后测试该字符串。只需直接测试结果,然后将其转换为可读的字符串。
private void flipCoin () {
boolean result = rgen.nextBoolean();
String coinFace;
if (result) {
nConsecutiveHeads++;
coinFace = "Heads";
} else {
nConsecutiveHeads = 0;
coinFace = "Tails";
}
System.out.println(coinFace);
}尽管您可以简单地这样做:
private void flipCoin () {
boolean result = rgen.nextBoolean();
nConsecutiveHeads = result ? nConsecutiveHeads + 1 : 0;
System.out.println(result ? "Heads" : "Tails");
}您可能应该养成使用格式字符串而不是字符串连接的习惯。这通常是更好的练习。
下一步更多的是风格问题,但如果不需要将nConsecutiveHeads保持为状态变量,我就不会将其保留为类成员。您可以将它定义为run方法中的一个变量,然后将其传递给flipCoin,如下所示:
public void run () {
int nFlips = 0;
int nHeads = 0;
while (nHeads < CONSECUTIVE_HEADS_LIM) {
nHeads = flipCoin(nHeads);
nFlips++;
}
System.out.printf("You needed %d flips to get %d consecutive heads.", nFlips, nHeads);
}
private int flipCoin (int nHeads) {
boolean result = rgen.nextBoolean();
System.out.println(result ? "Heads" : "Tails");
return result ? nHeads + 1 : 0;
}发布于 2013-04-15 09:50:44
在@p.s.w.g's优秀答案的基础上,您也可以在while-loop's条件下使用? :条件运算符来操作nHeads的值。
public class HavingFun {
private static final int CONSECUTIVE_HEADS_LIM = 3;
private static java.util.Random rgen = new Random(System.currentTimeMillis());
public static void main(String[] args) {
int nFlips = 1;
int nHeads = 0;
while ((nHeads = (rgen.nextBoolean() ? ++nHeads : 0)) < CONSECUTIVE_HEADS_LIM) {
System.out.println(nHeads == 0 ? "Tails" : "Heads");
nFlips++;
}
System.out.printf("Heads\nYou needed %d flips to get %d consecutive heads.",
nFlips, nHeads);
}
}条件是:如果rgen.nextBoolean为true,则增量nHeads并使用nHeads的新值(因此,变量前面的++,也称为增量前运算符),否则将nHeads设置为0。在循环中,我们检查nHeads是否重置为0,并相应地打印Tails或Heads。
您还可以看到循环在Heads的最后一次抛出时退出,这解释了为什么最后的输出语句有一个额外的Heads行。出于同样的原因,nFlips被初始化为1,因为它无论如何都需要增加。
我认为@p.s.w.g的S回答是介绍Java编程的一个良好开端,而我的解决方案只是一个更短的解决方案,而不是更好的解决方案(考虑到上面的额外解释)。希望您对Java编程中巧妙的技巧有一个更好的认识!
https://codereview.stackexchange.com/questions/25068
复制相似问题