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轴刻度长度
<