Java 如何获得掷一定数量的骰子所需的掷骰次数?

Java 如何获得掷一定数量的骰子所需的掷骰次数?,java,Java,说明:继续“掷骰子”,直到达到总共七个骰子,并记录达到七个骰子需要多少个骰子。打印出每次试验的卷数 每次试验后,卷数都保持不变,我不知道为什么 import java.util.*; public class GeometricDistribution { public static void main (String [] args) { Scanner keyboard = new Scanner(System.in); System.out.println(

说明:继续“掷骰子”,直到达到总共七个骰子,并记录达到七个骰子需要多少个骰子。打印出每次试验的卷数

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

    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);
    }           
  }
}
import java.util.*;
公共类几何分布{
公共静态void main(字符串[]args){
扫描仪键盘=新扫描仪(System.in);
System.out.println(“请输入一个正整数”);
int输入=0;
//如果用户未输入实际整数,则循环
而(!keyboard.hasNextInt()){
System.out.println(“请输入一个整数值”);
keyboard.nextLine();//删除用户输入的所有内容
}
输入=键盘.nextInt();

while(input
for(inti=1;i对于循环中的每个迭代,您都需要一个
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);
      }

    } 

对于(int i=1;i您将通过以下方式少计算一次sum!=7:

do {
  numRolls++;
  int die1 = (int)(Math.random()*6+1);
  int die2 = (int)(Math.random()*6+1);
  sum = die1 + die2;
} while ((sum) != 7);
通过在求值之前计算sum,编译器有更好的机会不使用任何内存进行sum。类似地,在die2之后使用sum也意味着不使用内存进行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.
do{
++numRolls;
twodices=(int)(Math.random()*36;//同时抛出2个骰子
}而(两个骰子<6);//0-5代表6次不同的投掷,得到7次。

查看编辑。有关重置总和的内容会导致计算7所需的平均转鼓数的错误值。随着试验量的增加,它应该接近6。您应该学习“do while”,如“do{numRolls++;die1=…;sum=die1+die2;}while(sum!=7);”嘿,米克尔,谢谢你的见解。你能看一下最新的编辑并让我知道你的想法吗?还没有学会printf方法…将在API上研究它。谢谢你的输入,哈米德。@tharooj,所以你可以用这个
System.out.println(“你滚动了一个“+sum+”)+numRolls);
    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);
      }

    } 
do {
  numRolls++;
  int die1 = (int)(Math.random()*6+1);
  int die2 = (int)(Math.random()*6+1);
  sum = die1 + die2;
} while ((sum) != 7);
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.