C#使用Linq和Loop计算集合的平均值、方差【标准差】

方差【标准差】

标准差公式是一种数学公式。标准差也被称为标准偏差,或者实验标准差,公式如下所示:

样本标准差=方差的算术平方根=s=sqrt(((x1-x)^2 +(x2-x)^2 +......(xn-x)^2)/n)

总体标准差=σ=sqrt(((x1-x)^2 +(x2-x)^2 +......(xn-x)^2)/n )

注解:上述两个标准差公式里的x为一组数(n个数据)的算术平均值。当所有数(个数为n)概率性地出现时(对应的n个概率数值和为1),则x为该组数的数学期望

公式意义

所有数(个数为n)记为一个数组[n]。将数组的所有数求和后除以n得到算术平均值。数组的所有数分别减去平均值,得到的n个差值分别取平方,再将得到的所有平方数求和,然后除以数的个数或个数减一若所求为总体标准差则除以n,若所求为样本标准差则除以(n-1),最后把得到的商取算术平方根,就是取1/2次方,得到的结果就是这组数(n个数据)的标准差。

 新建窗体应用程序AverageAndDeviationDemo,将默认的Form1重命名为FormAverageAndDeviation。

窗体FormAverageAndDeviation的视图编辑器源程序如下:

FormAverageAndDeviation.Designer.cs


namespace AverageAndDeviationDemo
{
    partial class FormAverageAndDeviation
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.rtxtMessage = new System.Windows.Forms.RichTextBox();
            this.btnGenerate = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // rtxtMessage
            // 
            this.rtxtMessage.Location = new System.Drawing.Point(217, 95);
            this.rtxtMessage.Name = "rtxtMessage";
            this.rtxtMessage.Size = new System.Drawing.Size(687, 550);
            this.rtxtMessage.TabIndex = 0;
            this.rtxtMessage.Text = "";
            // 
            // btnGenerate
            // 
            this.btnGenerate.Location = new System.Drawing.Point(38, 93);
            this.btnGenerate.Name = "btnGenerate";
            this.btnGenerate.Size = new System.Drawing.Size(149, 23);
            this.btnGenerate.TabIndex = 1;
            this.btnGenerate.Text = "生成随机集合后开始比较";
            this.btnGenerate.UseVisualStyleBackColor = true;
            this.btnGenerate.Click += new System.EventHandler(this.btnGenerate_Click);
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(215, 64);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(143, 12);
            this.label1.TabIndex = 2;
            this.label1.Text = "迭代Loop与Linq性能比较:";
            // 
            // FormAverageAndDeviation
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(981, 714);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.btnGenerate);
            this.Controls.Add(this.rtxtMessage);
            this.Name = "FormAverageAndDeviation";
            this.Text = "计算集合平均值和标准差【方差】的示例";
            this.Load += new System.EventHandler(this.FormAverageAndDeviation_Load);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.RichTextBox rtxtMessage;
        private System.Windows.Forms.Button btnGenerate;
        private System.Windows.Forms.Label label1;
    }
}

窗体代码如下:

FormAverageAndDeviation.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AverageAndDeviationDemo
{
    public partial class FormAverageAndDeviation : Form
    {
        public FormAverageAndDeviation()
        {
            InitializeComponent();
            rtxtMessage.ReadOnly = true;
        }

        /// <summary>
        /// 显示操作内容
        /// </summary>
        /// <param name="text"></param>
        private void DisplayMessage(string text) 
        {
            this.BeginInvoke(new Action(() => 
            {
                if (rtxtMessage.TextLength > 20480) 
                {
                    rtxtMessage.Clear();
                }
                rtxtMessage.AppendText($"{DateTime.Now.ToString("HH:mm:ss.fff")}->{text}\n");
                rtxtMessage.ScrollToCaret();
            }));
        }

        private void FormAverageAndDeviation_Load(object sender, EventArgs e)
        {
            List<double> array = new List<double>() { 1, 2, 3, 4, 5, 6 };
            CalculateAverageAndDeviation(array);
            CalculateAverageAndDeviationUseLoop(array);
        }

        /// <summary>
        /// 计算 平均值和 标准差【方差】
        /// 使用Linq迭代查询
        /// </summary>
        /// <param name="array"></param>
        private void CalculateAverageAndDeviation(IList<double> array) 
        {
            if (array == null || array.Count == 0) 
            {
                throw new ArgumentException($"无法对空集合求取平均值");
            }
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            //获取 平均值
            double average = array.Average();
            //获取方差之和
            double sumDeviation = array.Select(x => Math.Pow(x - average, 2)).Sum();
            //目标 标准差
            double standardDeviation = Math.Sqrt(sumDeviation / array.Count);
            stopwatch.Stop();
            double elapsedTime = stopwatch.Elapsed.TotalMilliseconds;//耗时ms
            DisplayMessage($"【Linq】average:{average}\nsumDeviation:{sumDeviation}\nstandardDeviation:{standardDeviation}\nElapsedTime:{elapsedTime}ms");
        }

        /// <summary>
        /// 计算 平均值和 标准差【方差】
        /// 使用循环迭代器
        /// </summary>
        /// <param name="array"></param>
        private void CalculateAverageAndDeviationUseLoop(IList<double> array)
        {
            if (array == null || array.Count == 0)
            {
                throw new ArgumentException($"无法对空集合求取平均值");
            }
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            double sum = 0;
            for (int i = 0; i < array.Count; i++)
            {
                sum += array[i];
            }
            //获取 平均值
            double average = sum / array.Count;
            sum = 0;
            for (int i = 0; i < array.Count; i++)
            {
                sum += Math.Pow(array[i] - average, 2);
            }
            //获取方差之和
            double sumDeviation = sum;
            //目标 标准差
            double standardDeviation = Math.Sqrt(sumDeviation / array.Count);
            stopwatch.Stop();
            double elapsedTime = stopwatch.Elapsed.TotalMilliseconds;//耗时ms
            DisplayMessage($"【Loop】average:{average}\nsumDeviation:{sumDeviation}\nstandardDeviation:{standardDeviation}\nElapsedTime:{elapsedTime}ms");
        }

        /// <summary>
        /// 生成10.0~99.9之间的随机集合
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        private double[] GenerateRandomArray(int count) 
        {
            double[] array = new double[count];
            for (int i = 0; i < count; i++)
            {
                array[i] = new Random(i + 1).Next(100, 1000) * 0.1;
            }
            return array;
        }

        private async void btnGenerate_Click(object sender, EventArgs e)
        {
            double[] array = GenerateRandomArray(500);
            DisplayMessage($"打印源数组【{string.Join(",", array)}】");
            Task linqTask = Task.Run(() => CalculateAverageAndDeviation(array));
            Task loopTask = Task.Run(() => CalculateAverageAndDeviationUseLoop(array));
            Task.WaitAll(linqTask, loopTask);
            await loopTask;
        }
    }
}

测试运行如图:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/43615.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

win11我们无法创建新的分区也找不到现有的分区

U盘重装系统的时候 提示&#xff1a;win11我们无法创建新的分区也找不到现有的分区 ShiftF10 &#xff0c;调出 命令提示符&#xff1b; diskpart list disk select disk 盘编号 clean convert gpt 参考&#xff1a;怎么解决我们无法创建新的分区也找不到现有的分区问题&#x…

OpenCV实现照片换底色处理

目录 1.导言 2.引言 3.代码分析 4.优化改进 5.总结 1.导言 在图像处理领域&#xff0c;OpenCV是一款强大而广泛应用的开源库&#xff0c;能够提供丰富的图像处理和计算机视觉功能。本篇博客将介绍如何利用Qt 编辑器调用OpenCV库对照片进行换底色处理&#xff0c;实现更加…

HTTP 缓存机制 强制缓存/协商缓存

为什么被缓存&#xff0c;如何命中缓存以及缓存什么时候生效的&#xff0c;我们却很少在实际开发中去了解。借助动画形式来从根上理解 HTTP 缓存机制及原理。 HTTP 缓存&#xff0c;对于前端的性能优化方面来讲&#xff0c;是非常关键的&#xff0c;从缓存中读取数据和直接向服…

REST和RPC的区别

1 REST REST 不是一种协议&#xff0c;它是一种架构。大部分REST的实现中使用了RPC的机制&#xff0c;大致由三部分组成&#xff1a; method&#xff1a;动词&#xff08;GET、POST、PUT、DELETE之类的&#xff09;Host&#xff1a;URI&#xff08;统一资源标识&#xff09;&…

前端Vue uni-app App/小程序/H5 通用tree树形结构图

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。 通过组件化开发&#xff0c;可以有效实现…

Apple M1 Pro macOS 切换中文输入法卡住

(macOS 在切换中文输入法时出现卡住的情况 1&#xff0c;切换为中文输入法后再次卡住2&#xff0c;杀死 简体中文输入方式的进程参考 将光标移到菜单栏的输入法切换为英文输入法 多次切换为英文输入法&#xff0c;可以切换为英文输入法 切换为英文输入法后电脑不卡顿了&#xf…

云原生基础设施实践:NebulaGraph 的 KubeBlocks 集成故事

像是 NebulaGraph 这类基础设施上云&#xff0c;通用的方法一般是将线下物理机替换成云端的虚拟资源&#xff0c;依托各大云服务厂商实现“服务上云”。但还有一种选择&#xff0c;就是依托云数据基础设施&#xff0c;将数据库产品变成为云生态的一环&#xff0c;不只是提供自身…

《面试1v1》如何提高远程用户的吞吐量

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

【单调栈 +前缀和】AcWing 4738. 快乐子数组

原题链接 原题链接 相关算法概念介绍 前缀和&#xff08;Prefix Sum&#xff09; 前缀和是指将数组中从开头位置到当前位置的所有元素累加得到的新数组。通常&#xff0c;我们使用一个额外的数组来保存这些累加和&#xff0c;这个数组被称为前缀和数组。对于原始数组A&…

性能测试Ⅵ(总结)

locust&#xff1a;是基于Python语言的性能测试工具&#xff0c;它是基于协程的思想来进行设计的。Python语言是没有办法利用多核的优势&#xff0c;所以了Python为了解决这个问题&#xff0c;设计了协程&#xff0c;作为协程的任务&#xff0c;遇到IO堵塞就立刻切换。 生命是协…

项目初始化--uniapp--vscode--vue3--ts

HBuilderX 创建 uni-app 项目 注意开启服务端口 目录结构 ├─pages 业务页面文件存放的目录 │ └─index │ └─index.vue index页面 ├─static 存放应用引用的本地静态资源的目录(注意&#xff1a;静态资源只能存放于此) ├─unpackage …

Ceph 应用

Ceph 应用 一、创建 CephFS 文件系统 MDS 接口 1.服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds create node01 node02 node032&#xff09;查看各个节点的 mds 服务 ssh rootnode01 systemctl status ceph-mdsnode01 ssh rootnode02 syst…

代码随想录| 图论02●695岛屿最大面积 ●1020飞地的数量 ●130被围绕的区域 ●417太平洋大西洋水流问题

#695岛屿最大面积 模板题&#xff0c;很快.以下两种dfs&#xff0c;区别是看第一个点放不放到dfs函数中处理&#xff0c;那么初始化的area一个是1一个是0 int dir[4][2]{0,1,0,-1,1,0,-1,0};void dfs(int x, int y,int n, int m, int &area,vector<vector<bool>…

K8S初级入门系列之十一-安全

一、前言 安全是K8S重要的特性&#xff0c;在K8S初级入门系列之四-Namespace/ConfigMap/Secret章节&#xff0c;我们已经已经了解了Namespace&#xff0c;Secret与安全相关的知识。本篇将梳理K8S在安全方面的策略。主要包括两个方面&#xff0c;API安全访问策略以及Pod安全策略…

YOLOv5基础知识

定位和检测: 定位是找到检测图像中带有一个给定标签的单个目标 检测是找到图像中带有给定标签的所有目标 图像分割和目标检测的区别&#xff1a; 图像分割即为检测出物体的完整轮廓&#xff0c;而目标检测则是检测出对应的目标。&#xff08;使用框框把物体框出来&#xff…

Linux:多进程和多线程回环socket服务器和客户端

多进程socket服务器代码&#xff1a; #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <string.h> #include <ctype.h> #include <sys/wait.h> #i…

06.计算机网络——IP协议

文章目录 网络层IP协议基本概念协议头格式如何解包如何交付网段划分子网掩码特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址路由 网络层 IP协议 IP协议提供一种将数据从A主机送达到B主机的能力&#xff0c;进行网络层的通信。 ​ IP协议 基本概念 主机 —— 配有IP地址…

SpringCloudAlibaba微服务实战系列(五)Sentinel1.8.5+Nacos持久化

Sentinel数据持久化 前面介绍Sentinel的流控、熔断降级等功能&#xff0c;同时Sentinel应用也在面临着一个问题&#xff1a;我们在Sentinel后台管理界面中配置了一堆流控、降级规则&#xff0c;但是Sentinel一重启&#xff0c;这些规则全部消失了。那么我们就要考虑Sentinel的持…

小程序路由跳转页面重复问题

目标&#xff1a;想要某个页面在历史中&#xff08;页面栈&#xff09;只显示一次 什么是页面栈&#xff1a; 在小程序开发中&#xff0c;页面栈是指小程序当前打开的页面的层级关系堆栈。每当打开一个新页面时&#xff0c;它会被放置在页面栈的顶部&#xff0c;而当前页面就位…

Linux学习之Ubuntu 20.04安装内核模块

参考博客&#xff1a;Ubuntu20.04编译内核教程 sudo lsb_release -a可以看到我当前的系统是Ubuntu 20.04.4&#xff0c;sudo uname -r可以看到我的系统内核版本是5.4.0-100-generic。 sudo apt-get install -y libncurses5-dev flex bison libssl-dev安装所需要的依赖。 su…