import java.text.DecimalFormat;
import java.util.Random;
/*
* 功能:計算並比較各類型平均數,調和<=幾何<=算術<=平方
*/
public class Average {
private final static double dmax=999;//Double.MAX_VALUE;
//Double類型的最大值,太大的double值,相乘會達到無窮大
private final static double dmin=Double.MIN_VALUE;//Double類型的最小值
private final static int n=100;//假設求取100個doubl數的各類平均值
public static void main(String[] args){
Random random = new Random();
double[] x=new double[n];
for(int i=0;i<n;i++){//隨機生成n個double數
x[i]=Double.valueOf(Math.floor(random.nextDouble()*(dmax-dmin)));
}
//設置doubl字符串輸出格式,不以科學計數法輸出
DecimalFormat df=new DecimalFormat("#,##0.00");//格式化設置
//計算調和平均數
double dHM=HarmonicMean(x);
System.out.println("調和平均數="+df.format(dHM));
//計算幾何平均數
double dGM=GeometricMean(x);
System.out.println("幾何平均數="+df.format(dGM));
//計算算術平均數
double dAM=ArithmeticMean(x);
System.out.println("算術平均數="+df.format(dAM));
//計算平方平均數
double dMS=MeanSquare(x);
System.out.println("平方平均數="+df.format(dMS));
//計算中位數,用冒泡排序
double dMN=MedianNumber(x);
System.out.println("中位數="+df.format(dMN));
}
//中位數,排序後去中間值,用冒泡排序
public static double MedianNumber(double[] x) {
double temp; // 記錄臨時中間值
int m = x.length; // 數組大小
for (int i = 0; i < m - 1; i++) {
for (int j = i + 1; j < m; j++) {
if (x[i] < x[j]) { // 交換兩數的位置
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
if(m%2==0) //偶數
return (x[m/2]+x[m/2+1])/2;//偶數
else //奇數
return x[m/2+1]/2;
}
//算術平均數:是一組數據的代數和除以數據的項數所得的平均數
public static double ArithmeticMean(double[] x){
int m=x.length;
double sum=0;
for(int i=0;i<m;i++){//計算x值的倒數
sum+=x[i];
}
return sum/m;
}
//平方平均數:是一組數據的平方和除以數據的項數的開方
public static double MeanSquare(double[] x){
int m=x.length;
double sum=0;
for(int i=0;i<m;i++){//計算x值的倒數
sum+=x[i]*x[i];
}
return Math.sqrt(sum/m);
}
//幾何平均數:是n個數據的連乘積的開n次方根。
public static double GeometricMean(double[] x){
int m=x.length;
double sum=1;
for(int i=0;i<m;i++){//計算x值的倒數
sum*=x[i];
}
return Math.pow(sum,1.0/m);//返回sum的m次方根
}
//調和平均數:一組數據的倒數和除數據的項數的倒數。
public static double HarmonicMean(double[] x){
int m=x.length;
double sum=0;
for(int i=0;i<m;i++){//計算x值的倒數
sum+=1/x[i];
}
return m/sum;
}
}