如何获得滚动一定数量的骰子数量?

时间:2015-07-11 20:05:42

标签: java

方向:保持"滚动骰子"直到达到总共7个,并记录到达7个所需的卷数。打印每次试验的卷数。

每次试用后,卷数保持不变,我不知道为什么。

    import java.util.*;
  public class GeometricDistribution {
  public static void main (String [] args) {
    Scanner keyboard = new Scanner(System.in);
    System.out.println("Please enter a positive integer.");
    int input = 0;
    //loop if the user doesn't enter an actual integer
    while (!keyboard.hasNextInt()) {
      System.out.println("Enter an integer value, please.");
      keyboard.nextLine();  //remove everything the user input 
    }
    input = keyboard.nextInt();
    while (input <= 0) {
      System.out.println("Please enter a POSITIVE integer.");
      input = keyboard.nextInt();
    }
    int sum = 0;
    int numRolls = 0;
    for (int i = 1; i <= input; i++) {
      while ((sum) != 7) {
        numRolls++;
        int die1 = (int)(Math.random()*6+1);
        int die2 = (int)(Math.random()*6+1);
        sum = die1 + die2;
      }
      System.out.println("You rolled a 7 on roll #" + numRolls);
    }           
  }
}

编辑:这是我的代码现在的样子:

    int sum;
int numRolls = 0;
int sumRolls = 0;
for (int i = 1; i <= input; i++) {
  sum = 0; 
  while ((sum) != 7) {
    numRolls++;
    int die1 = (int)(Math.random()*6+1);
    int die2 = (int)(Math.random()*6+1);
    sum = die1 + die2;
  }
  System.out.println("You rolled a 7 on roll #" + numRolls);
  sumRolls += numRolls;
}
System.out.println("Average number of rolls to get a 7: " + (sumRolls/input));

看起来不错吗?

编辑:

这是我为此计划提交给我的教授的最终代码。明确,完整的指示如下:

  

编写一个程序来运行一个简单的概率实验共N个   试验(其中N是来自用户的正整数输入)。每个   试验的实验,模拟两个六面骰子的滚动   使用随机数并计算总数。保持&#34;滚动骰子&#34;   直到达到总共七个,并记录它有多少卷   需要达到七。打印出每卷的卷数   审判。例如,在第一次试验中,它可能需要五卷   在看到七个之前(七个出现在第五卷上)和之前   第二次试验可能需要8个卷直到7个等等。   程序结束时打印出平均卷数   在N次试验中获得了7分。笔记:   +你的程序应检查用户对N的输入是否为正整数。它应该重新提示用户,直到他们输入正面   如果它们输入0或负数,则为整数。 (如果用户输入   非整数,可以让程序崩溃)   +最简单的方法可能会在嵌入for循环内的每个试验中使用while循环,该循环计算试验总数达到   ñ   +你需要跟踪每次试验所用的卷数之和,以便能够计算出所有的平均值。   试验结束了   +此程序模拟几何概率分布......当N增加平均试验次数达到7时应接近6   (因为有一个1/6的机会滚动7)

我的回答:

import java.util.*;
public class HW9 {
  public static void main (String [] args) {
    Scanner keyboard = new Scanner(System.in);
    System.out.println("Please enter a positive integer.");
    int input = 0;
    //loop if the user doesn't enter an actual integer
    while (!keyboard.hasNextInt()) {
      System.out.println("Enter an integer value, please.");
      keyboard.nextLine();  //remove everything the user input 
    }
    input = keyboard.nextInt();
    while (input <= 0) {
      System.out.println("Please enter a POSITIVE integer.");
      input = keyboard.nextInt();
    }
    int sumRolls = 0;
    for (int i = 1; i <= input; i++) {
      int sum = 0;
      int numRolls = 0;
      while ((sum) != 7) {
        int die1 = (int)(Math.random()*6+1);
        int die2 = (int)(Math.random()*6+1);
        sum = die1 + die2;
        numRolls++;
      }
      System.out.println("You rolled a 7 on roll #" + numRolls);
      sumRolls += numRolls;
    }
    System.out.println("Average number of rolls to get a 7: " + (sumRolls/input));
  }
}

请告诉我您对上述代码的效率和优雅方面的看法。

非常感谢任何建议。

3 个答案:

答案 0 :(得分:1)

for (int i = 1; i <= input; i++) {
  sum = 0; // add this
  while ((sum) != 7) {
    numRolls++;
    int die1 = (int)(Math.random()*6+1);
    int die2 = (int)(Math.random()*6+1);
    sum = die1 + die2;
  }
  System.out.println("You rolled a 7 on roll #" + numRolls);
}  

您需要为迭代重新启动总和

答案 1 :(得分:0)

循环中的每次迭代都需要printf

    for (int i = 1; i <= input; i++) {
      while ((sum) != 7) {
        numRolls++;
        int die1 = (int)(Math.random()*6+1);
        int die2 = (int)(Math.random()*6+1);
        sum = die1 + die2;
        System.out.printf("You rolled a %d on roll #" + numRolls + "\n", sum);
      }

    } 

答案 2 :(得分:0)

您将通过以下方式评估sum!= 7一次:

do {
  numRolls++;
  int die1 = (int)(Math.random()*6+1);
  int die2 = (int)(Math.random()*6+1);
  sum = die1 + die2;
} while ((sum) != 7);

并且在评估之前计算总和使编译器更好地不使用任何内存进行求和。类似于在die2之后的总和意味着不使用die2的内存。因此,最后3行可以更好地获得最优化的结果代码。

更特别的优化是:

do {
  ++numRolls;
  twodices = (int)(Math.random()*36; // Throws 2 dices at the same time
} while (twodices < 6); // 0 - 5 represents the 6 different throws giving 7.