使用Java进行硬币投掷模拟/游戏

时间:2015-09-22 21:24:02

标签: java simulation

我目前正在从事计算机科学课程,这在技术上适合初学者,但我觉得他们给我的所有作业都比我能处理的更复杂。

这项任务要求我进行抛硬币模拟。三个人玩游戏,每个人都有特定的要求赢得:

  • 如果有2个结果头和投掷总数,则获胜一次 甚至是
  • 如果有2个结果尾部并且总投掷次数为
  • ,则获胜一次
  • 如果有两个结果尾部或头部且总投掷数为奇数
  • ,则获胜一次

我应该做的是进行300次实验。每次我都应该确定三人赢了多少次以及多少次。我真的卡住了。我几乎没有任何代码,但我对代码应该是什么有一个非常基本的想法,但我不能把它放到Java语言中。

对于我的作业,我需要显示导致一个人获胜的二进制序列。

我的想法:

  1. 为每个人初始化一个计数器(1,2,3),以便我可以跟踪他们获胜的次数
  2. 初始化头数和尾数以跟踪随机生成的序列
  3. 实际上在整个实验中使用for循环。应该有一个外部循环定义实验应该运行300次,内部循环应该包含if语句来检查谁赢了。每个if语句都应该有一个计数器,以便我可以为每个人更新它。我需要一个System.out.println();打印实验的每一个结果。
  4. 使用先前确定的计数器
  5. 打印实验的最终结果

    修改 我试图改变每个人所说的内容,现在确实看起来更好,谢谢!但它仍然没有做它应该做的事情,我想知道为什么。我运行代码,我只得到一个输出;不是我希望它运行的300次。此外,最后的计数器不会保存关于谁赢了的信息,他们每次都会重置。有时候两个人会赢,但那是不可能的。任何人都可以澄清这个吗?

    修改 这是代码的另一个更新。我相信它确实运行了300次!现在的问题是输出。有时会说; 1伯尼赢了,而你显然需要至少2个结果让伯尼获胜。此外,它说1 Penny赢了,而那也不可能。我在if语句中搞砸了什么吗?

    import java.util.Random;
    
    public class Assignment3e
    {
    public static void main(String[] args)
    {                
        int counter1 = 0;
        int counter2 = 0;
        int counter3 = 0;
    
        Random coin = new Random();
    
    
        for(int i = 0; i <= 300; i++){
            int headCount = 0;
            int tailsCount = 0;
            for(int coinToss = 0; coinToss <= 3; coinToss++){
                int random = (int) (Math.random() * 6) + 1;
                String binary = Integer.toBinaryString(random);
    
              boolean result = coin.nextBoolean();
              if(result){
                  headCount++;
                  }
                  else{
                      tailsCount++;
                      }
             if(headCount == 2 && binary.length() % 2 ==0){
                    //Amy wins
                    counter1 = counter1 + 1;
                    System.out.println(binary + " Amy wins.");
                }
                else if(tailsCount == 2 && binary.length() % 2 == 0){
                    //Penny wins
                    counter2 = counter2 + 1;
                    System.out.println(binary + " Penny wins.");
                }
                else if(headCount == 2 || tailsCount == 2 && binary.length() % 2 != 0){
                    //Bernie wins
                    counter3 = counter3 + 1;
                    System.out.println(binary + " Bernie wins.");
                }
             }
          }
            System.out.println("Amy wins " + counter1 + " times.");
            System.out.println("Penny wins " + counter2 + " times.");
            System.out.println("Bernie wins " + counter3 + " times.");
    }
    
    }
    

3 个答案:

答案 0 :(得分:4)

你几乎做对了。

此部分不再相关,因为OP在评论中添加了一项要求。

  

你的第二个for循环只需要运行最多3次,因为至少有2个头或2个尾巴,而不是10个。

     

编辑:你可以使用最多2次投掷:如果有1个头部和1个尾部,则获胜者是第3个玩家(Bernie

     

现在,在每次迭代中,你可以绘制一个0到1之间的随机十进制数,并假设它超过0.5它是一个头,所以你增加headCount,否则你增加{{ 1}}。然后你可以对计数器(以及投掷次数)进行测试。

     

比使用二进制字符串更容易。

编辑: 回答你的评论: 查看您初始化tailCountheadCount的位置。请记住,一旦获胜,必须重置这些计数器。

由于这是家庭作业,我不会发布代码:)

修改 OP jsut添加了一条评论,说明他需要打印导致每场比赛结果的序列。

我们假设二进制tailCount是头部,而1是尾部。如果0获胜,您需要掷硬币3次才能知道序列。因此,以二进制字符串转换的整数值Bernie只需要由3位(1位= 1折)组成。

random只能取0到7之间的值。

当您一次性获得所有值时,您不再需要random for循环。您需要做的就是检查二进制字符串的开头是否匹配任何获胜模式(2个头为coinToss,2个尾为11,否则伯尼获胜)

答案 1 :(得分:0)

所以我在这里注意到了一些事情:

  • 您不会在任何地方更新headCounttailCount。这应该是你用来跟踪硬币翻转的数量。

    当你在后续循环中重新使用它们时,一定要将它们重新归零。

  • 如果只需要一个简单的nextBoolean就足够了,那么你的结果范围非常广泛。您可以在循环中使用它:

    boolean result = coin.nextBoolean(); // this renames dice to coin
    if(result) {
        headCount++;
    } else {
        tailCount++;
    }
    
  • 投掷总数始终当前迭代的当前值(加1)。因此,在您的情况下,您只需将sum替换为j,但您希望为其指定更有意义的名称,例如coinTosses

答案 2 :(得分:0)

如果您为硬币nextBoolean()使用Random()对象,为什么不用int random = (int) (Math.random() * 6) + 1;替换int random = coin.nextInt([range here])