求一组数字序列的分布情况(java)
最近需要做一个正态分布的函数图像所以要处理一段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)的更多相关文章
- 求数组的最小数、最大值,求一组数的平均数,sort函数详解,类数组转数组
求数组的最小值和最大值 //求数组当中最大值和最小值 var arr=[3,2,6,1,45,23,456,23,2,6,3,45,37,89,30]; //第一种方法 根据排序方法来求最大值和最小值 ...
- 【BZOJ1049】 [HAOI2006]数字序列
BZOJ1049 [HAOI2006]数字序列 dp好题? 第一问 第一问我会做!令\(b_i=a_i-i\),求一个最长不下降子序列. \(n-ans\)就是最终的答案. 第二问 好难啊.不会.挖坑 ...
- 洛谷P4331 [BOI2004] Sequence 数字序列 [左偏树]
题目传送门 数字序列 题目描述 给定一个整数序列 a1,a2,⋅⋅⋅,an ,求出一个递增序列 b1<b2<⋅⋅⋅<bn ,使得序列 ai 和 bi 的各项之差的绝对 ...
- 【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)
1049: [HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变 ...
- 洛谷 P2501 [HAOI2006]数字序列 解题报告
P2501 [HAOI2006]数字序列 题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. ...
- luogu 4331 [BalticOI 2004]Sequence 数字序列
LINK:数字序列 这是一道论文题 我去看了一眼论文鸽的论文. 发现讲的还算能懂.可并堆的操作也讲的比较清晰. 对于这道题首先有一个小trick 我们给a数组全部减去其对应的下标这样我们求出来的b数组 ...
- 剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位
剑指 Offer 44. 数字序列中某一位的数字 Offer_44 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author Wale ...
- 【总结】matlab求两个序列的相关性
首先说说自相关和互相关的概念. 自相关 在统计学中的定义,自相关函数就是将一个有序的随机变量系列与其自身作比较.每个不存在相位差的系列,都与其都与其自身相似,即在此情况下,自相关函数值最大. 在信号 ...
- 【BZOJ】【1049】【HAOI2006】数字序列
DP 第一问比较水……a[i]-=i 以后就变成最长不下降子序列问题了,第二问这个结论好神奇,考试的时候怎么破?大胆猜想,不用证明?TAT 题解:http://pan.baidu.com/share/ ...
随机推荐
- SOLR使用手册之操作collection
一.Collections API 参考:https://cwiki.apache.org/confluence/display/solr/Collections+API 因为API比较多,我就不一 ...
- TCP 和 UDP 协议发送数据包的大小 (转载)
MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC由于以太网传输电气方面的限制,每个以太网帧都有最小的大小 ...
- Sigmoid function in NN
X = [ones(m, ) X]; temp = X * Theta1'; t = size(temp, ); temp = [ones(t, ) temp]; h = temp * Theta2' ...
- 何时可以开启透明数据加密(TDE)?
TDE可以为我们的数据库提供加密保护,但是,不是任何情况下都可以随意开启TDE的,同时开启TDE后,我们的数据库维护管理工作也需要进行一些调整. 下面我们就先看看开启TDE需要的条件吧! 无法正常开启 ...
- FSG压缩壳和ImportREC的使用 - 脱壳篇05
FSG压缩壳和ImportREC的使用 - 脱壳篇05 让编程改变世界 Change the world by program FSG这个壳可以说是有点儿不守妇道,尼玛你说你一个压缩壳就实现压缩功能得 ...
- innobackupex 使用说明
1.创建备份相关用户 '; grant reload,lock tables,replication client,process,super on *.* to 'backuper'@'127.0. ...
- Struts2+JQuery+JSON实现异步交互
1.环境 jquery:jquery-1.9.0.min.js struts2:基本包就不说了,就说说应用json的包,主要有struts2-json-plugin-2.3.8.jar json:js ...
- jQuery插件之artDialog
artDialog是一个非常强大的弹出框插件.默认有两个版本,一个是jQuery版,一个是javascript版.功能非常多,而且使用非常简单.不写了,直接贴上官网的预览运行地址,以后用得着的时候去那 ...
- linux系统下,11款常见远程桌面控制软件
linux系统下,11款常见远程桌面控制软件 一. Grdc 它是一个用GTK+编写的,适用于gnome桌面环境的远程桌面访问软件.看图: 常见功能: 1.提供全屏,窗口化的远程控制.支持高分辨率下的 ...
- Linux系统编程(3)——文件与IO之fcntl函数
linux文件I/O用:open.read.write.lseek以及close函数实现了文件的打开.读写等基本操作.fcntl函数可以根据文件描述词来操作文件. 用法: int fcntl(int ...