最近需要做一个正态分布的函数图像所以要处理一段double序列

写了这个算法 

先上效果图:

核心思想:

1先根据步长计算每一个区间

2循环进行判断序列中每个数属于哪个区间

3用一个数组来保存每一个区间中 数的个数

这样就可以得到整个分布函数了 当然效率值得考虑 我的机器1百万以上的数据就会有问题了

这是一个double类型的例子 int型就更容易啦

上代码!

 package com.huang.distribution;

 import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections; public class DistributeDoubleList { /**
* @authr huanglizhe 2014-08-09
* 对若干个double值进行范围统计
*/
static int length=100;//随机生成多少个数据 1百万时效率有所下降
static int effective_number=3;//决定要保留的小数点后有效位数
static BigDecimal temp;
static ArrayList<Double> list;//原始数据
static double add_data;
static double max;
static double min;
static double range;//等间隔值=(max-min)/space
static int space =10;//步长 你要分为几个区间 public static void main(String[] args) {
generatedata();
getrange();
showdata();
distribute();
} //生成length个随机double序列 并添加到list中
public static void generatedata()
{
list=new ArrayList<Double>();
for(int i=0;i<length;i++)
{
temp =new BigDecimal(Math.random()*100);//取0-100随机数
//取effective_number=3位有效位
add_data=temp.setScale(effective_number, BigDecimal.ROUND_HALF_UP).doubleValue();
list.add(add_data);
} System.out.println("生成数据");
showdata();
} //打印已添加好的数据
public static void showdata()
{
System.out.println("list数据---------");
for(int i=0;i<list.size();i++)
{
System.out.print(" "+list.get(i));
}
System.out.println();
System.out.println("list数据---------");
System.out.println();
} //得到等间隔的值
public static void getrange()
{ Collections.sort(list);//排序 以方便得到最大最小值
min=list.get(0);
max=list.get(list.size()-1);
range=(max-min)/space;
temp =new BigDecimal(range);
range=temp.setScale(effective_number, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println("2:排序并计算min,max,range");
System.out.print("序列min="+min+"\t");
System.out.print("序列max="+max+"\t");
System.out.println("序列range="+range+"\t"); } public static void distribute()
{
int[] arr=new int[space+1];//用来保存这些值分布个数的数组
int k=0; //j执行j=add(j,range)的时候会有精度损失所以加到最后个range的时候往往<max 所以要多循环一次 所以会产生多一个k值
for(double j=min;j<=add(max,range);j=add(j,range))
{
//执行j=add(j,range)后 j就前进了一个范围
System.out.print("区间"+k+" ["+j+","+add(j,range)+"] ");//输出范围
//循环去除list中的值进行比较 如果j<值<j+range的话则属于这个范围
//然后领arr[k]的值+1
for(int i=0;i<list.size();i++)
{
if(list.get(i)>=j&&list.get(i)<add(j,range))
{
arr[k]++;
}
} k++;//因为j每次挪动一个范围所以k判断完后也要++
}
System.out.println();
System.out.println("----分布情况arr-------");
for(int i=0;i<=space;i++)
{ System.out.print(" "+arr[i]);//最后输出的分布个数 }
System.out.println(); //简易图像
for(int i=0;i<=space;i++)
{
System.out.print("区间"+i);
for(int j=0;j<arr[i];j++)
{ System.out.print("▊");
} System.out.println();
} } //处理2个double数相加 避免出现2个相加后等于.013999999999999等情况
public static double add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
} }

最新文章

  1. J2EE学习路线图
  2. Scrapy002-框架安装
  3. linux 系统管理 使用技巧
  4. table_tricks_基于bootstrap
  5. Redis基础
  6. C# toString()转换详细(转)
  7. Altium Designer 多通道设计
  8. JSP学习笔记(二):Tomcat服务器的安装及配置
  9. .NET学习路线图
  10. ExtJs 带参数的MVC
  11. 使用curl制作简易百度搜索
  12. Daily Scrum 12.20
  13. ionic页面间跳转的动画实现
  14. [java,2017-06-12] myEclipse双击无法打开文件
  15. How do you explain Machine Learning and Data Mining to non Computer Science people?
  16. dataguard从库数据库丢失恢复例子(模拟丢失数据文件)
  17. Hplsql报错:...HiveSQLExpection:Error while compiling statement:No privilege &#39;Select&#39; found for inputs {.....}
  18. const关键字对C++成员函数的修饰
  19. Scrum立会报告+燃尽图 04
  20. Ant打jar包时,参数名被修改的问题

热门文章

  1. 使用Battery Historian(android 5.0)
  2. 跨平台渲染框架尝试 - GPU Buffer的管理(1)
  3. (原)caffe中fine tuning及使用snapshot时的sh命令
  4. 评论PK投票功能的手机版
  5. HTML5简单入门系列(七)
  6. img元素高度多出来的几像素
  7. mysql 二进制安装的基本步骤
  8. linux查找命令find
  9. 树上战争(HDU 2545 并查集求解点到根节点长度)
  10. jdbc 处理mysql procedure返回的多个结果集