【问题标题】:Coin Flip Sequence硬币翻转序列
【发布时间】:2017-03-28 17:12:44
【问题描述】:

我被这个项目困住了。我必须编写一个生成 HTH (121) 的硬币翻转程序,并且我必须计算生成该序列需要投掷多少次。之后,我需要计算序列的平均值。我在下面有代码。例如:如果我得到

的输出
1112222222122122122211222121
28
11111122121
11
11121
5

那么我的平均值应该是 (28+11+5)/3=14.66667。但是,我坚持编码平均值。我已经设置了 for 循环,但我不确定将代码放在哪里或如何放置平均值。

我正在考虑做类似的事情

int average= count/N;

但我不知道如何将每个计数相互添加以及在没有编译器说“计数无法解析为变量”的情况下将此语句放在哪里

 package HTX_Program;


public class coinSequence {
        public static int coinFlip() {
            MultiDie coin= new MultiDie(2);
            coin.roll();
            int x = coin.getFaceValue();
            return x;
            }

public static void main(String[] args) {
    final int N=3;
    for(int i=0; i<N; i++){
    String sequenceSoFar = "";
    sequenceSoFar += coinFlip();
    sequenceSoFar += coinFlip();
    sequenceSoFar += coinFlip();
    int count = 3;
    if(!sequenceSoFar.equals("121")) {
        while(!(sequenceSoFar.substring(sequenceSoFar.length() - 3).equals("121"))) {
            sequenceSoFar += coinFlip();
            count++;
        }
    }

    System.out.println(sequenceSoFar);
    System.out.println(count);
    }
    int average= count/N;
}
}

【问题讨论】:

  • 请注意,当您进行整数除法 (count/N) 时,1/32/3 之类的操作将返回 0。如果需要小数,请使用 double
  • 平均值不是 int,它应该是 double double avarage = count * 1.0 / N ; 你还需要乘以 1.0,否则会产生 int 除法。
  • 好的,谢谢。我忘了!

标签: java


【解决方案1】:

首先您需要跟踪所有循环的总翻转次数:

int totalFlips = 0;

然后你需要在每次翻转时增加它:

totalFlips++;

那么最后,在循环之后,就可以计算平均值了:

// Note: You have to convert one of the integers to double in order to get correct result.
double average = totalFlips / (double)N;

这里是完整的修改功能:

public static void main(String[] args) {
    final int N=3;
    int totalFlips = 0; // Track total flips.

    for(int i=0; i<N; i++){
        String sequenceSoFar = "";
        sequenceSoFar += coinFlip();
        sequenceSoFar += coinFlip();
        sequenceSoFar += coinFlip();
        int count = 3;
        totalFlips += 3; // add initial 3 flips to total.
        if(!sequenceSoFar.equals("121")) {
            while(!(sequenceSoFar.substring(sequenceSoFar.length() - 3).equals("121"))) {
                sequenceSoFar += coinFlip();
                count++;
                totalFlips++; // increment total flips.
            }
        }

        System.out.println(sequenceSoFar);
        System.out.println(count);
    }

    double average = totalFlips / (double)N; // Calculate average.
}

【讨论】:

    【解决方案2】:

    虽然 musefan 的解决方案是完全正确的,但我觉得同时计算运行中的“计数”和运行期间的“totalFlips”有点奇怪。 我只会做 1 次跑步,然后将那次跑步的“计数”添加到 totalFlips 中。 为了使其更加明显,我还将在单独的方法中运行一次。 (以下基于musefan的代码):

    public static void main(String[] args) {
        final int N=3;
        int totalFlips = 0; // Track total flips.
    
        for(int i=0; i<N; i++){
            int count = nbRollsInNewSequence();
            totalFlips += count;
        }
    
        double average = totalFlips / (double)N; // Calculate average.
    }
    
    //rolls a die until the sequence "121" comes up. 
    //Prints this count and the sequence and then returns the count.
    public static int nbRollsInNewSequence(){
        String sequenceSoFar = "";
        sequenceSoFar += coinFlip();
        sequenceSoFar += coinFlip();
        sequenceSoFar += coinFlip();
        int count = 3;
        if(!sequenceSoFar.equals("121")) {
            while(!(sequenceSoFar.substring(sequenceSoFar.length() - 3).equals("121"))) {
                sequenceSoFar += coinFlip();
                count++;
            }
        }
    
        System.out.println(sequenceSoFar);
        System.out.println(count);
        return count;
    }
    

    【讨论】:

    • @iajrz 实际检测与@musefan 的代码完全相同。我只是将处理序列(如您的 1121 示例)拉到一个单独的方法中。然后删除该方法内递增的 totalFlips。结果应该完全相同。请注意,sequenceSoFar.substring(sequenceSoFar.length()-3) 在运行序列中进行最后 3 次翻转。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2018-07-27
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多