编辑代码

import java.math.BigDecimal;
import java.math.RoundingMode;

public class NormalDistributionCalculator {

    /**
     * 计算标准正态分布的累积分布函数(CDF)
     * 使用Hart算法近似计算
     */
    public static double standardNormalCDF(double z) {
        final double[] a = {0.31938153, -0.356563782, 1.781477937, -1.821255978, 1.330274429};
        final double p = 0.2316419;
        final double c = 0.39894228; // 1/sqrt(2*PI)
        
        if (z >= 0) {
            double t = 1.0 / (1.0 + p * z);
            double sum = t * (a[0] + t * (a[1] + t * (a[2] + t * (a[3] + t * a[4]))));
            return 1.0 - c * Math.exp(-0.5 * z * z) * sum;
        } else {
            return 1.0 - standardNormalCDF(-z);
        }
    }

    /**
     * 计算一般正态分布的累积分布函数
     * @param x 要计算的值
     * @param mean 均值
     * @param sd 标准差
     * @return P(X ≤ x)
     */
    public static double normalCDF(double x, double mean, double sd) {
        if (sd <= 0) {
            throw new IllegalArgumentException("标准差必须大于0");
        }
        double z = (x - mean) / sd;
        return standardNormalCDF(z);
    }

    /**
     * 计算正态分布在区间[a,b]内的概率 P(a ≤ X ≤ b)
     */
    public static double normalProbability(double lower, double upper, double mean, double sd) {
        if (lower > upper) {
            throw new IllegalArgumentException("下界不能大于上界");
        }
        double pLower = normalCDF(lower, mean, sd);
        double pUpper = normalCDF(upper, mean, sd);
        return pUpper - pLower;
    }

    /**
     * 格式化概率值为百分比字符串
     */
    public static String formatAsPercentage(double probability) {
        BigDecimal bd = new BigDecimal(probability * 100);
        bd = bd.setScale(4, RoundingMode.HALF_UP);
        return bd.doubleValue() + "%";
    }

    public static void main(String[] args) {
        // 示例:计算均值=100,标准差=15的正态分布在85到115之间的概率
        double mean = 100;
        double sd = 15;
        double lower = 85;
        double upper = 115;
        
        double probability = normalProbability(lower, upper, mean, sd);
        
        System.out.println("正态分布 N(" + mean + ", " + sd + "^2) 在区间 [" + 
                          lower + ", " + upper + "] 内的概率为:");
        System.out.println("P(" + lower + " ≤ X ≤ " + upper + ") = " + probability);
        System.out.println("即 " + formatAsPercentage(probability));
    }
}