Java骰子程序求助:修复点数统计错误及实现百分比计算
解决骰子程序的统计问题与百分比计算
首先看你遇到的两个核心问题:statistics方法统计次数错误,以及不知道如何计算指定点数的出现百分比,我们一步步来修复:
现有代码的核心问题
- 统计逻辑错误:你用了静态变量
total保存每次投掷结果,但每次循环都会覆盖它,最后total只保留最后一次投掷的数值。所以statistics方法里的循环其实是在重复判断最后一次的结果是不是7,自然只会输出0或1,根本没统计所有投掷次数。 - 没有保存所有投掷结果:没有存储每次投掷的点数,没法统计2-12每个点数的出现次数。
- 硬编码统计7:没有使用用户输入的
number参数,固定统计7的次数,不符合需求。
修复后的完整代码
import java.util.*; public class EZD_diceRoll { // 用数组存储2-12各点数的出现次数,索引对应点数(索引0、1不用) private static int[] pointCounts = new int[13]; private static int totalRolls; private static int targetNumber; public static void main(String args[]) { roll(); statistics(); } public static void roll() { Random nums = new Random(); Scanner kbReader = new Scanner(System.in); System.out.print("How many times would you like to roll? "); totalRolls = kbReader.nextInt(); System.out.print("What number (dice roll total) do you want the statistics for (2 - 12)? "); targetNumber = kbReader.nextInt(); // 验证输入的目标点数是否合法 if (targetNumber < 2 || targetNumber > 12) { System.out.println("Invalid number! Please enter a value between 2 and 12."); kbReader.close(); return; } for (int a = 1; a <= totalRolls; a++) { int die1 = 1 + nums.nextInt(6); int die2 = 1 + nums.nextInt(6); int total = die1 + die2; System.out.println("Dice roll #" + a + " is " + total); // 统计当前点数的出现次数 pointCounts[total]++; } kbReader.close(); } public static void statistics() { // 获取目标点数的出现次数 int targetCount = pointCounts[targetNumber]; // 计算百分比:注意用浮点运算,避免整数除法导致结果为0 double percentage = (double) targetCount / totalRolls * 100; // 先输出所有点数的统计结果 System.out.println("\n--- All Point Statistics ---"); for (int i = 2; i <= 12; i++) { System.out.println("Point " + i + " appeared " + pointCounts[i] + " times"); } // 输出指定点数的百分比 System.out.println("\n--- Target Point Statistics ---"); System.out.printf("%d次投掷中%d出现%d次,占比%.1f%%%n", totalRolls, targetNumber, targetCount, percentage); } }
关键修复点解释
- 用数组存储点数次数:创建
pointCounts数组,索引对应点数(2-12),每次投掷后pointCounts[total]++,这样就能准确统计每个点数的出现次数。 - 移除不必要的静态变量:原来的
die1、die2、total不需要设为静态,放在roll方法里作为局部变量更合适,避免变量被意外覆盖。 - 百分比计算:把
targetCount强制转换为double再除以总次数,这样就能得到浮点结果,再乘以100得到百分比。用printf可以方便地格式化输出百分比(比如保留1位小数)。 - 输入验证:增加了对目标点数的合法性检查,避免用户输入2-12以外的数值。
- statistics方法逻辑优化:直接从数组中取目标点数的次数,不需要再循环统计,效率更高,逻辑更清晰。
现在运行这个程序,就能正确输出每次投掷结果、所有点数的出现次数,以及指定点数的出现百分比啦!
内容的提问来源于stack exchange,提问作者bugjuice
相关产品推荐
相关产品推荐

