package mathTest;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class DataEx {
public double GetDataEx(List data, String[] results, int num) {
// 得到数据的总个数
int dataNum = data.size();
int m=0;
int n=0;
double retu=1.0;
//计算在原始数据中所有对象出现的次数 写入到map中
Map map = new HashMap();
for (String temp : data) {
Integer count = (Integer) map.get(temp);
map.put(temp, (count == null) ? 1 : count + 1);
}
//计算在组合后的数据中某个组合所有对象出现的次数 写入到map中
Map map1 = new HashMap();
for (String temp : results) {
Integer count = (Integer) map1.get(temp);
map1.put(temp, (count == null) ? 1 : count + 1);
}
//得到map1中的所有键
Iterator iterator=map1.keySet().iterator();
while(iterator.hasNext()){
Object ob=iterator.next();
int n1= (int)map.get(ob);
int m1= (int)map1.get(ob);
retu=retu*this.Calculation(m1, n1);
}
retu=retu/this.Calculation(num, dataNum);
return retu;
}
//求得组合c(m,n)的结果
public double Calculation(int m, int n) {
//分子值
double numerator=n;
//分母值
double denominator=m;
for (int i = n; i > n-m+1; i--) {
numerator = numerator * (i - 1);
}
//因为在java中double输出会默认使用科学记数法输出,所以数值位数较多是需要将其格式化为指定指定格式
//System.out.println(new DecimalFormat("###############0.000000").format(numerator));
for (int j = m; j >1; j--) {
denominator = denominator *(j - 1);
}
//System.out.println(new DecimalFormat("###############0.000000").format(denominator));
double retu=numerator/denominator;
return retu;
}
}
main类:主程序类,主要用于主程序的逻辑执行,初始化并输出各项数据,计算数学期望package mathTest;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class main {
public static void main(String[] args) {
DataEx dataex=new DataEx();
//原始数据
List data = new ArrayList();
//用来标识从中取的个数
int flag=10;
//用来设置求期望的X,若不设置则默认X为抽得分数
List Ex = new ArrayList();
Ex.add((double) 2500);
Ex.add((double) 178);
Ex.add((double) 2);
Ex.add((double) 3);
Ex.add((double) -22);
Ex.add((double) -22);
Ex.add((double) 5);
Ex.add((double) 8);
Ex.add((double) 44);
Ex.add((double) 88);
Ex.add((double) 1000);
//用来存放求得的期望
Double expectation=0.0;
for(int i=0;i<10;i++){
data.add("10");
}
for(int i=0;i<10;i++){
data.add("5");
}
Combine t = new Combine();
for(int i = 1; i < data.size(); i++)
t.combinerSelect(data, new ArrayList(), data.size(), i);
Iterator it=t.testSet.iterator();
//用来存放数据相加的值,用来判断是否有重复项
List sums = new ArrayList();
//用来记录是第几个组合
int a=1;
//循环得到每个组合
while(it.hasNext()){
//得到组合
String item=it.next().toString();
//进行字符串分割
String[] results = item.split(",");
int sum=0;
//如果长度是设定的取出的个数
if(results.length==flag){
for(int j=0;j
sum=sum+Integer.parseInt(results[j]);
}
sums.add(sum);
boolean f=false;
//循环判断sum是否在sums中有重复的值
for(int i=0;i
if(sum==sums.get(i))
f=true;
}
if(!f){
System.out.println("-----------第"+a+"个组合分析开始-----------");
System.out.println("组合:"+item);
System.out.println("组合相加值:"+sum);
Double probability=dataex.GetDataEx(data,results,flag);
System.out.println("组合概率分布(分布率):"+new DecimalFormat("###############0.000000").format(probability));
if(Ex!=null&&Ex.size()!=0){
expectation=expectation+Ex.get(a-1)*probability;
}else{
expectation=expectation+sum*probability;
}
System.out.println();
a++;
}
}
}
System.out.println("数学期望为:"+new DecimalFormat("###############0.000000").format(expectation));
}
}