Java 在掷硬币模拟器中计算最长的连续跑数

Java 在掷硬币模拟器中计算最长的连续跑数,java,Java,我在一个初级Java编程课程中,我们的任务之一是编写一个程序,模拟用户指定次数投掷硬币。函数类cointost.java如下所示: public class CoinToss { private char[] results; private int numHeads; private int numTails; private double headsFrac; private double tailsFrac; private int currentRun; p

我在一个初级Java编程课程中,我们的任务之一是编写一个程序,模拟用户指定次数投掷硬币。函数类cointost.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.");
     }
  }
公共类cointost{
私有字符[]结果;
私人国际首脑会议;
私人国际货币;
私人双重压裂;
私人双轨电车;
私家车;
私人结果;
公共硬币投掷(整数){
结果=新字符[numTosses];
for(int i=0;i
}

我主要关心的是
getLongestRun()
方法。说明中说:创建一个方法,检查抛硬币的数组以定位最长的硬币 可能的头尾摆动。您将需要两个属性, 这些属性具有当前连续结果数(一次运行)和 与跑步相关的结果(头部或尾部)。在一个循环中,比较每次投掷 在数组中添加到结果 当前运行的一部分。如果它们匹配,则当前运行为 现在被认为是一个更长的。如果它们不匹配,则当前运行已停止 结束了。比较此运行中刚刚完成的连续结果数 以迄今为止最多的连续结果结束 前所未见 (迄今为止最长的跑步记录)。这是否是一个新的最长的 运行,将当前结果重置为刚刚检查的结果,并重置 当前运行到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

您不存储每次运行的结果;只需在新运行开始时覆盖上一个值。这意味着您的
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

只是样式问题,与功能无关,但在本例中,由于您只有两种可能性,因此可以轻松使用布尔值而不是字符。不过,最好的情况是使用枚举。只是样式问题,与功能无关,但在这种情况下,由于您只有两种可能性,因此可以轻松使用布尔值而不是字符。不过,最好的情况是使用枚举。您只需保持最大运行时间,例如,将
int longestHeadlun
int longestTailRun
添加到
getLongestRun()
并将其设置为
currentRun
,然后再重置该值。您只需保持最大运行时间,例如,将
int longestHeadRun
int longestTailRun
添加到
getLongestRun()
中,并在重置之前将其设置为
currentRun