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(inputfor(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.