You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

关键修复点解释

  1. 用数组存储点数次数:创建pointCounts数组,索引对应点数(2-12),每次投掷后pointCounts[total]++,这样就能准确统计每个点数的出现次数。
  2. 移除不必要的静态变量:原来的die1、die2、total不需要设为静态,放在roll方法里作为局部变量更合适,避免变量被意外覆盖。
  3. 百分比计算:把targetCount强制转换为double再除以总次数,这样就能得到浮点结果,再乘以100得到百分比。用printf可以方便地格式化输出百分比(比如保留1位小数)。
  4. 输入验证:增加了对目标点数的合法性检查,避免用户输入2-12以外的数值。
  5. statistics方法逻辑优化:直接从数组中取目标点数的次数,不需要再循环统计,效率更高,逻辑更清晰。

现在运行这个程序,就能正确输出每次投掷结果、所有点数的出现次数,以及指定点数的出现百分比啦!

内容的提问来源于stack exchange,提问作者bugjuice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:15:12