1

我正在上一门 Java 编程课程,我们的任务之一是编写一个程序,该程序模拟用户指定次数的抛硬币。函数类 CoinToss.java 如下所示:

public class CoinToss {
  private char[] results;
  private int numHeads;
  private int numTails;
  private double headsFrac;
  private double tailsFrac;

  private int currentRun;
  private char currentOutcome;

  public CoinToss(int numTosses) {
     results = new char[numTosses];
     for(int i = 0; i < results.length; i++) {
        double number = Math.random();
        if(number < 0.5) {
           results[i] = 't';
        }
        else {
           results[i] = 'h';
        }
     }

  }

  public void count() {
     for(int i = 0; i < results.length; i++) {
        if(results[i] == 't') numTails++;
        else numHeads++;
     }
     headsFrac = (double)numHeads/results.length;
     tailsFrac = (double)numTails/results.length;
  }

  public double getFracHeads() {
     return headsFrac;
  }

  public double getFracTails() {
     return tailsFrac;
  }

  public char[] getTosses() {
     return results;
  }

  public void getLongestRun() {
     currentOutcome = 'h';
     for(int i = 0; i < results.length; i++) {
        if(currentOutcome == results[i]) {
           currentRun++;
        }
        else {
           currentOutcome = results[i];
           currentRun = 1;
        }
     }

     if(currentOutcome == 'h') {
        System.out.println("Longest run was " + currentRun + " heads.");
     }
     else {
        System.out.println("Longest run was " + currentRun + " tails.");
     }
  }

}

我主要关心的领域是getLongestRun()方法。说明说:创建一个检查抛硬币数组的方法,以找出抛掷的正面或反面最长的可能序列。您将需要两个属性,这些属性具有当前连续结果的数量(一次运行)和与运行相关的结果(头部或尾部)。在一个循环中,将数组中的每次抛掷与当前运行的结果进行比较。如果它们匹配,则当前运行现在被识别为更长的运行。如果它们不匹配,则当前运行已结束。将本次运行中刚刚结束的连续结果的数量与之前看到的最多的连续结果(迄今为止最长的运行)进行比较。无论这是否是新的最长运行,将当前结果重置为刚刚检查的结果,并将当前运行的长度重置为 1。

我主要关心的是如何使该方法正常工作。它没有正确计算最长的连续正面或反面数量。

4

1 回答 1

1

您不存储每次运行的结果;您只需在新的运行开始时覆盖以前的值。这意味着您的getLongestRun()方法只会打印最后一次运行的长度,而不是最长的。

要解决此问题,您需要将每次运行的结果记录在一个数组(或者,最好是一个对象结构,如ArrayList)中,然后遍历它以找到最大值。或者,您可以简单地拥有一个始终保持最大条纹的变量,如果它低于当前最大值,则简单地丢弃最新的。

我不会为您提供完整的代码,因为这是课程作业,但这是我的意思的伪代码(Pythonic)想法:

current_streak = 0
longest_streak = 0
current_coin = coin_toss_list[0]
for coin in coin_toss_list:
    if current_coin == coin:
        current_streak = current_streak + 1
    else:
        if current_streak > longest_streak:
            longest_streak = current_streak
        current_streak = 1
        current_coin = coin
print "Longest streak was " + longest_streak
于 2013-10-28T16:38:28.297 回答