import java.math.BigDecimal;
import java.math.RoundingMode;
public class NormalDistributionCalculator {
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;
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);
}
}
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);
}
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) {
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));
}
}