【问题标题】:How flipping a coin and display tails and heads counting?如何掷硬币并显示反面和正面数?
【发布时间】:2014-04-11 18:15:12
【问题描述】:

我是 Java 的初学者,仍然对 Java 充满热情。 我得到了这个练习:“编写一个掷硬币的模拟器程序:一千次然后打印出你得到反面的次数和正面的次数” 到目前为止,这就是我尝试做的事情。

import java.util.Random; 
import java.util.regex.Pattern; 

public class coin { 

    public static void main( String [] args ) { 

        Random r = new Random(); 
        Pattern tail = Pattern.compile("Tail+"); 
        Pattern head = Pattern.compile("Head+"); 
        String flips = ""; 

        for (int i = 0; i < 1000; i++) { 
            flips += r.nextInt(100) % 2 == 0 ? "Head" : "Tail"; 
        } 
        String[] heads = head.split( flips ); 
        String[] tails = tail.split( flips ); 
        //Display
        System.out.println("Times head was flipped:" + heads.length); 
        System.out.println("Times tail was flipped:" + tails.length); 
    }
}

该程序似乎正在运行,但它总是给我几乎一对正面和反面,总数超过 1000,至少超过 1 个或更多。 拜托,有人对此有任何解决方案吗?我哪里错了? 谢谢

【问题讨论】:

    标签: java random coin-flipping


    【解决方案1】:

    我对我的评估有类似的问题,我尝试了下面的代码并且它有效。可能是它不合适的做法。 我很高兴收到反馈!谢谢。

    for (int i = 1; i < 1000; i++) { 
        flips += r.nextInt(100) % 2 == 1 ? "Head" : "Tail";
    }
    

    【讨论】:

    • 您认为这会起作用,但事实并非如此!问题还涉及到头尾之和并不总是 1000,有时是 999、998、1001 或 1002。如果您查看创建的数组,就会发现问题所在。您可以重新表述您的答案,以便实际问题变得明显。
    【解决方案2】:

    您可以在单独的变量中跟踪计数,而不是将结果附加到字符串中,然后拆分字符串并计算“头”/“尾”的出现次数:

    int headCount = 0;
    int tailCount = 0;
    
    for (int i = 0; i < 1000; i++) {
        if(r.nextInt(100) %2 == 0)
        {
          headCount++;
        }
        else
        {
          tailCount ++;
        }
    
      System.out.println("Times head was flipped:" + headsCount); 
      System.out.println("Times tail was flipped:" + tailCount); 
    
    }
    

    【讨论】:

      【解决方案3】:

      硬币有两个面,所以我真的不明白你为什么要让随机生成器生成一个介于 0 和 100 之间的数字(不包括在内)。介于 0 和 2(不包括在内)之间会更合乎逻辑。

      另外,你被要求数数。附加字符串然后拆分以获得最终值是一种非常复杂且低效的计数方式。您应该改用整数。每次从随机数中获得 1 时,增加一个计数器。最后,您有返回 1 的次数,因此 0 的数量是 1000 - 这个数字。

          Random r = new Random(); 
          int heads = 0;
          for (int i = 0; i < 1000; i++) { 
              int side = random.nextInt(2);
              if (side == 1) {
                  heads++;
              } 
          } 
          System.out.println("Times head was flipped:" + heads); 
          System.out.println("Times tail was flipped:" + (1000 - heads)); 
      

      它甚至可以简化为以下内容(尽管这种简化使代码更难理解):

          Random r = new Random(); 
          int heads = 0;
          for (int i = 0; i < 1000; i++) { 
              heads += random.nextInt(2);
          } 
          System.out.println("Times head was flipped:" + heads); 
          System.out.println("Times tail was flipped:" + (1000 - heads)); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-07
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2018-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多