方向:保持"滚动骰子"直到达到总共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));
}
}
请告诉我您对上述代码的效率和优雅方面的看法。
非常感谢任何建议。
答案 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.