最近需要做一个正态分布的函数图像所以要处理一段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();
} }

求一组数字序列的分布情况(java)的更多相关文章

  1. 求数组的最小数、最大值,求一组数的平均数,sort函数详解,类数组转数组

    求数组的最小值和最大值 //求数组当中最大值和最小值 var arr=[3,2,6,1,45,23,456,23,2,6,3,45,37,89,30]; //第一种方法 根据排序方法来求最大值和最小值 ...

  2. 【BZOJ1049】 [HAOI2006]数字序列

    BZOJ1049 [HAOI2006]数字序列 dp好题? 第一问 第一问我会做!令\(b_i=a_i-i\),求一个最长不下降子序列. \(n-ans\)就是最终的答案. 第二问 好难啊.不会.挖坑 ...

  3. 洛谷P4331 [BOI2004] Sequence 数字序列 [左偏树]

    题目传送门 数字序列 题目描述 给定一个整数序列 a1​,a2​,⋅⋅⋅,an​ ,求出一个递增序列 b1​<b2​<⋅⋅⋅<bn​ ,使得序列 ai​ 和 bi​ 的各项之差的绝对 ...

  4. 【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)

    1049: [HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变 ...

  5. 洛谷 P2501 [HAOI2006]数字序列 解题报告

    P2501 [HAOI2006]数字序列 题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. ...

  6. luogu 4331 [BalticOI 2004]Sequence 数字序列

    LINK:数字序列 这是一道论文题 我去看了一眼论文鸽的论文. 发现讲的还算能懂.可并堆的操作也讲的比较清晰. 对于这道题首先有一个小trick 我们给a数组全部减去其对应的下标这样我们求出来的b数组 ...

  7. 剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位

    剑指 Offer 44. 数字序列中某一位的数字 Offer_44 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author Wale ...

  8. 【总结】matlab求两个序列的相关性

    首先说说自相关和互相关的概念.  自相关 在统计学中的定义,自相关函数就是将一个有序的随机变量系列与其自身作比较.每个不存在相位差的系列,都与其都与其自身相似,即在此情况下,自相关函数值最大. 在信号 ...

  9. 【BZOJ】【1049】【HAOI2006】数字序列

    DP 第一问比较水……a[i]-=i 以后就变成最长不下降子序列问题了,第二问这个结论好神奇,考试的时候怎么破?大胆猜想,不用证明?TAT 题解:http://pan.baidu.com/share/ ...

随机推荐

  1. 前端判断用户请求是PC还是移动端

    链接:https://www.zhihu.com/question/20004700/answer/13678113 第一步先在服务器端使用User Agent判断,先匹配出移动设备,这一步可以统计U ...

  2. jquery 根据网站url给导航nav添加active效果

    后台的同事因为把nav公用了,所以无法单页添加active,一下方法通过判断url的后缀给当前页添加active $(function(){ var _nava= $('.nav .nav-wrapp ...

  3. JS如何判断IE和火狐与Chrome浏览器

    var isIE=navigator.userAgent.toUpperCase().indexOf("MSIE")?true:false; 类似的可以写var isFirefox ...

  4. PHP学习笔记三十【final】

    <?php //final不能去修饰属性(变量) //如果希望类不希望被继承就可以使用final关键字 final class Person() { public function sayHi( ...

  5. PHP学习笔记二十【静态方法】

    <?php //静态变量的基本用法 //1,在类中定义变量 //2.定义方式[访问修饰符]static 变量名 //3.访问方式self::$变量名 第二种方式,类名::$变量名 //4.在类外 ...

  6. Java Timer触发定时器

    XML: <!-- Java Timer定时 --> <!-- <bean id="shortUrlTask" class=" com.sprin ...

  7. 限制oracle用户创建、删除、修改用户对象

    在sys用户下执行: CREATE OR REPLACE TRIGGER lms2014BEFORE create or DROP OR ALTER ON databaseDECLAREBEGINIF ...

  8. Qss样式(二)

    Qss 其实就是一段文本,当然得按一定格式来写.下面请看Qss的语法格式: 选择器 { 属性1:值:属性2:值:--属性n:值:} 对应上篇文章的Qss样式: 现在我们可以来解释这段话的意思了: 对应 ...

  9. netCDF

    NetCDF started in 1989 most used in geoscience community array-oriented self-describing header, desc ...

  10. Maven的使用--Eclipse在线安装Maven插件m2e

    我使用的Eclipse版本是3.7(Indigo) 通过Eclipse的help选项,点击“Install New Software...”弹出安装对话框, 点击add按钮,在Location里输入h ...