【问题标题】:A simulation the game of craps java一个模拟掷骰子java的游戏
【发布时间】:2016-11-12 22:31:36
【问题描述】:

这是我应该模拟掷骰子游戏的代码:我得到正确的输赢结果,但我无法获得正确的概率。有什么建议吗?

请帮助说明: 在掷骰子游戏中,及格线投注进行如下。掷出两个六面骰子;在掷骰子游戏中,第一次掷骰子称为“出局掷骰”。掷出 7 或 11 自动获胜,掷出 2、3 或 12 自动输。如果出局点数为 4、5、6、8、9 或 10,则该数字成为点数。玩家继续掷骰子,直到掷出 7 点或点数。如果点数先滚动,则玩家赢得赌注。如果先掷出 7,则玩家输。编写一个程序,在没有人工输入的情况下使用这些规则模拟掷骰子游戏。程序应该计算玩家是赢还是输,而不是要求下注。

程序应该模拟掷两个骰子并计算总和。添加一个循环,让程序玩 10,000 场游戏。添加计数器来计算玩家赢了多少次,以及玩家输了多少次。在 10,000 场比赛结束时,计算获胜的概率 [即 Wins / (Wins + Losses)] 并输出该值。从长远来看,谁会赢得最多的比赛,你还是房子?注意:要生成随机数 x,其中 0 x ≤

public class Dice 
{
    public static void main(String[]args)
    {
        //declaring variables
        int comeOutRoll1, comeOutRoll2;
        int roll1, roll2;
        int numW, numL;
        int sum, sum2 = 0;
        int thePoint = 0;
        double probability; 


        //initializing variables
        comeOutRoll1 = (int)(Math.random()*5);
        comeOutRoll2 = (int)(Math.random()*5);
        sum = comeOutRoll1 + comeOutRoll2;
        numW = 0;
        numL = 0;


        for(int timesPlayed = 0; timesPlayed <= 10000; timesPlayed++)
        {

            switch(sum)
            {
            //adds how many wins and losses
            case 2:
                numL = numL +1;
                break;
            case 3:
                numL = numL + 1;
                break;
            case 12:
                numL = numL + 1;
            break;
            case 7:
                numW = numW +1;
                break;
            case 11:
                numW = numW +1;
                break;
            case 4:
                thePoint = sum;
                break;
            case 5:
                thePoint = sum;
                break;
            case 6:
                thePoint = sum;
                break;
            case 8:
                thePoint = sum;
                break;
            case 9:
                thePoint = sum;
                break;
            case 10:
                thePoint = sum;
            break;
            //if not any of these cases roll again
            default:

                roll1 = (int)(Math.random()*5);
                roll2 = (int)(Math.random()*5);
                sum2 = roll1 + roll2;
                break;
            }

            if(sum2 == thePoint)
            {
                numW = numW +1;
            }
            else if(sum2 == 7)
            {
                numL = numL +1;
            }
        }


        probability = (numW/(numW+numL));

        System.out.println("Number of Wins: " + numW);
        System.out.println("Number of Losses: " + numL);
        System.out.println("The probability of winning is: " + probability + " percent");   


    }

}

【问题讨论】:

  • 旁注:您可以通过编写多个不带breakcase 语句来避免为不同的情况重新键入相同的代码,例如:case 4: case 5: case 6: case 8: case 9: case 10: thePoint = sum; break;
  • 太好了?你得到什么输出,你期望什么输出?即,实际问题是什么?
  • 这个模拟非常刺激... ;)
  • @BackSlash 我的输出是:获胜次数:369 失败次数:813 获胜概率是:0.0%

标签: java


【解决方案1】:

2 个问题...

  1. 您只分析 1 个(随机)出局。您需要在整个游戏中循环 10000 次,而不仅仅是次要滚动,它应该只循环直到您得到结果。
  2. 您正在进行整数除法(截断以留下整数)。通过将数字之一转换为floatdouble 来使用浮点数学。即probability = (float)numW/(numW+numL);

在伪代码中,使用辅助方法:

// returns the random integer between 1 and 6 inclusive
method rollDie()

// returns the sum of a random roll of 2 dice
method rollDice()
    return rollDie() + rollDie() 

// return true if the player won given the point
method won(point)
    roll = rollDice()
    if roll == 7 return false
    if roll == point return true
    return won(point)

// main
define wins variable (you don't need a losses variable. losses = 10000 - wins 
loop 10000 times {
    comeOut = rollDice()
    if comeOut in (7, 11) or (comeOut not in (2, 3 or 12) and won(comeOut))
        wins++
}
probability = (float)wins/10000

将上面的内容转换为 java,你应该很高兴(并且希望你能学到一些东西 - 请参阅 DRY)。

【讨论】:

  • 如何将循环扩展到整个游戏,而不仅仅是第二卷?
【解决方案2】:

编辑后的工作解决方案

public static void main(String[]args)
{
    //declaring variables
    int roll1, roll2;
    int numW = 0;
    int numL = 0;
    int sum = 0;
    int thePoint = 0;
    double probability; 


    // Loop will run 1001 time due to <=
    for(int timesPlayed = 0; timesPlayed <= 1000; timesPlayed++)
    {
        roll1 = (int)(Math.random()*5)+1;
        roll2 = (int)(Math.random()*5)+1;
        sum = roll1 + roll2;

        switch(sum)
        {
            //adds how many wins and losses
            case 2:
            case 3:
                numL = numL + 1;
                break;
            case 12:
                numL = numL + 1;
            break;
            case 7:
            case 11:
                numW = numW +1;
                break;
            case 4:
            case 5:
            case 6:
            case 8:
            case 9:
            case 10:
                thePoint = sum;
                break;
            default:
                // You should never logically reach here, so could remove.
        }

        if(thePoint!=0){
            do{
                roll1 = (int)(Math.random()*5)+1;
                roll2 = (int)(Math.random()*5)+1;
                sum = roll1 + roll2;
            }while(sum!=thePoint & sum!=7);

            if(sum == thePoint)
            {
                numW = numW +1;
            }else{
                numL = numL +1;
            }
        }
        thePoint = 0;
    }

    probability = (double)numW/(numW+numL); // (numW + numL) could just be total number of games if made into a variable and used as for loop condition aswell.

    System.out.println("Number of Wins: " + numW);
    System.out.println("Number of Losses: " + numL);
    System.out.println("The probability of winning is: " + probability + " percent");   

    }

你必须:

  • 循环时包括重新滚动,否则它会使用相同的重复值。
  • 如果是 4、5、6、8、9 或 10,那么您必须继续滚动,直到新的滚动等于 7 或thePoint
    • 在计算概率时,您正在执行整数除法,这可能导致舍入为 0。

按照规范工作。一些变量的整理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-19
    • 2016-02-07
    • 1970-01-01
    • 2013-03-07
    • 2018-10-19
    • 2015-12-24
    相关资源
    最近更新 更多