首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >硬币翻转码

硬币翻转码
EN

Code Review用户
提问于 2013-04-14 03:02:04
回答 2查看 3.3K关注 0票数 5

我正在为Java的艺术与科学教材做练习。我做了一个练习,要求我对抛硬币的模拟程序进行编程,直到连续3个“头”结果出现。

我做到了,但是我不确定我的代码是否足够简单--因为我使用一个实例变量来计数头和一个函数,它不仅可以翻转硬币,还可以计算连续的头。

我避免在run方法中放置太多行(因为im使用acm库,这是主要的方法),但我不确定这是否是最有效的编码。

下面是代码:

代码语言:javascript
复制
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();
}
EN

回答 2

Code Review用户

回答已采纳

发布于 2013-04-14 05:03:49

我真正突出的一点是:您不需要将nextBoolean()的布尔值结果转换为可读的字符串,然后测试该字符串。只需直接测试结果,然后将其转换为可读的字符串。

代码语言:javascript
复制
private void flipCoin () {
    boolean result = rgen.nextBoolean();
    String coinFace;
    if (result) {
        nConsecutiveHeads++;
        coinFace = "Heads";
    } else {
        nConsecutiveHeads = 0;
        coinFace = "Tails";
    }
    System.out.println(coinFace);
}

尽管您可以简单地这样做:

代码语言:javascript
复制
private void flipCoin () {
    boolean result = rgen.nextBoolean();
    nConsecutiveHeads = result ? nConsecutiveHeads + 1 : 0;
    System.out.println(result ? "Heads" : "Tails");
}

您可能应该养成使用格式字符串而不是字符串连接的习惯。这通常是更好的练习。

下一步更多的是风格问题,但如果不需要将nConsecutiveHeads保持为状态变量,我就不会将其保留为类成员。您可以将它定义为run方法中的一个变量,然后将其传递给flipCoin,如下所示:

代码语言:javascript
复制
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;
}
票数 7
EN

Code Review用户

发布于 2013-04-15 09:50:44

@p.s.w.g's优秀答案的基础上,您也可以在while-loop's条件下使用? :条件运算符来操作nHeads的值。

代码语言:javascript
复制
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,并相应地打印TailsHeads

您还可以看到循环在Heads的最后一次抛出时退出,这解释了为什么最后的输出语句有一个额外的Heads行。出于同样的原因,nFlips被初始化为1,因为它无论如何都需要增加。

我认为@p.s.w.g的S回答是介绍Java编程的一个良好开端,而我的解决方案只是一个更短的解决方案,而不是更好的解决方案(考虑到上面的额外解释)。希望您对Java编程中巧妙的技巧有一个更好的认识!

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/25068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档