Java绘制正态分布统计图

Java绘制正态分布统计图

1.正态分布

        正态分布(Normal distribution),又名高斯分布(Gaussian distribution),它在数学等工程领域中使用较为频繁的一种概率分布,尤其在统计学上有着重大的影响力。统计后的正态曲线呈钟型(两边低,中间高),如下图所示(图片来源百度百家号http://baijiahao.baidu.com/):
在这里插入图片描述

2.生成正态分布数据并统计

        在做开发的过程中,我们往往要模拟出一些正态分布的数据,统计后进行图表绘制。使用Java模拟正态分布是一件非常容易的事情,随机数类Random的nextGaussian方法提供。
        nextGaussian方法返回一个随机double类型数据,我们可以用一个数据容器存储该方法生成的若干个随机数。这些随机数会以0为基准随机生成正态分布的double数值,这些数值的均值接近0。在下面的程序示例中,我们利用nextGaussian生成若干个随机数,然后进行分组统计,最后在控制台上输出统计图表。

控制台输出正态分布统计图
01.	import java.util.ArrayList;
02.	import java.util.Comparator;
03.	import java.util.HashMap;
04.	import java.util.Map;
05.	import java.util.Random;
06.	import java.util.function.Supplier;
07.	import java.util.stream.Stream;
08.	
09.	public class Gauss {
   
10.	
11.		
12.		private int ySize;//统计的标记数目y轴(分组数)
13.		private int dataNumber;//生成的虚拟数据的个数
14.		private int xSize;//刻度数目x轴
15.	
16.		//保存生成的高斯数据
17.		private ArrayList<Double> list=new ArrayList<>();
18.		//根据分组统计数据个数
19.		private Map<Integer,Integer> map=new HashMap<>();
20.		
21.		public Gauss(int xSize,int ySize,int dataNumber) {
   
22.			this.ySize=ySize>3?ySize:3;
23.			this.xSize=xSize>3?xSize:3;
24.			this.dataNumber=dataNumber>1000?dataNumber:1000;
25.			init();
26.		}
27.		
28.		private void init() {
   
29.			//初始化高斯随机数
30.			Random ran=new Random();
31.			for(int i=0;i<dataNumber;i++) {
   
32.				list.add(ran.nextGaussian());
33.			}
34.			//初始化统计容器
35.			for(int i=1;i<=this.ySize;i++) {
   
36.				map.put(i, 0);
37.			}
38.		}
39.		//分析并统计高斯随机数
40.		public void analysis() {
   
41.			/*
42.			 * 利用Stream进行统计,由于Stream终极方法会关闭,当重复使用Stream时
43.			 * 我们需要用供应商不断的提供相同的stream。
44.			 */
45.			Supplier<Stream<Double>> supp=()->list.stream();//Lambda表达式给供应商
46.			//为Stream提供一个比较器
47.			Comparator<Double> comp=(e1,e2)->e1>e2?1:-1;
48.			//获取最大最小值
49.			double max=supp.get().max(comp).get();
50.			double min=supp.get().min(comp).get();
51.			double range=(max-min)/this.ySize;//计算统计区间的单位范围
52.			//将每一个标记区的数据统计后放入map中。
53.			for(int i=1;i<=this.ySize;i++) {
   
54.				double start=min+(i-1)*range;
55.				double end=min+i*range;
56.				Stream<Double> stream=supp.get()
57.							          .filter((e)->e>=start).filter((e)->e<end);
58.				map.put(i,(int)stream.count());
59.			}
60.		}	
61.		//绘制统计图
62.		public void grawValue() {
   
63.			int ScaleSize=14;//x轴刻度长度
<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值