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

news2024/11/24 0:43:53

方差【标准差】

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

样本标准差=方差的算术平方根=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;
        }
    }
}

测试运行如图:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

准备WebUI自动化测试面试?这30个问题你必须掌握(二)

本文共有11000字&#xff0c;包含了后十五个问题&#xff0c;如需要前十五个问题&#xff0c;可查看文末链接~ 16. 在WebUI自动化测试中&#xff0c;你如何处理验证码或图像识别的问题&#xff1f; 1. 人工识别&#xff1a;一种简单但费时费力的方法是使用人工手动识别验证码。…

什么是渲染?一文看懂,萌新赶紧收藏码住!

十四五规划提出“加快数字化发展&#xff0c;建设数字中国”&#xff0c;数字技术的快速发展&#xff0c;从起初的内容创建到最终的效果呈现&#xff0c;都离不开渲染技术。目前&#xff0c;渲染技术被广泛应用于教育、医疗、影视动画、建筑设计等多个领域。它能有效满足用户对…

小程序微信登陆实现流程

1. 微信登录流程 微信登录官方介绍&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 小程序登录&#xff1a;小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识&#xff0c;快速建立小程序内的用户体系…

Stable Diffusion - 图像反推 (Interrogate) 提示词算法 (BLIP DeepBooru)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131817599 图像反推 (Interrogate) 功能&#xff0c;是指根据给定的图像生成一个或多个文本提示&#xff0c;这些提示可以描述图像的内容、风格、…

Linux--crontab命令详解--循环执行的计划任务

Linux–crontab命令详解–循环执行的计划任务 文章目录 Linux--crontab命令详解--循环执行的计划任务一、用户设置二、crontab三、/etc/crontab,/et/cron.d/*总结 一、用户设置 循环执行任务是由cron(crond)这个系统服务来控制的。用户想要建立循环的计划任务时,使用的是cront…

TypeScript 1 - 小记

文章目录 关于 TypeScript 关于 TypeScript TypeScript is a superset of JavaScript that compiles to clean JavaScript output. 官网&#xff1a;https://www.typescriptlang.orggithub : https://github.com/microsoft/TypeScriptplayground : https://www.typescriptlan…

Alibaba Cloud Toolkit部署操作

一、后端部署&#xff1a; 第一步 第二步&#xff1a; 第三步&#xff1a; 二、前端部署 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a;

学会项目成本管理计算,PMP计算题就是送分题

学会项目成本管理计算&#xff0c;PMP计算题就是送分题 PMP中的计算主要在 <项目成本管理> 的控制成本部分&#xff0c;服务于挣值管理&#xff08;EVM&#xff0c;Earned Value Management&#xff09;、挣值分析&#xff08;EVA&#xff0c;Earned Value Analysis&…

【0】冒泡排序

前言 通过函数模板技术设计一个冒泡排序算法&#xff0c;领悟泛型编程的思想和冒泡排序的思想&#xff0c;然后使用QTest测试各种输入值&#xff0c;养成先写测试代码&#xff0c;后写程序代码的习惯 0x0 编写一个int版本的冒泡函数 1.不管要排序的数组长度多长&#xff0c;外…

Postman如何设置成中文?(汉化)

1. 点击下方这个链接&#xff0c;进入gitee&#xff0c;在里面下载一个插件 Releases hlmd/Postman-cn GitHub 进入之后是这个样子的&#xff1a; 2.看一下自己的postman是什么版本的&#xff0c;然后在gitee下载对应的APP包&#xff08;注意&#xff1a;是App.zit包。不要下…

中金:龙湖基本面稳健,股价超跌具备配置价值

恒大2.4万亿元的天量债务爆出后&#xff0c;让本就信心不足的房地产行业&#xff0c;越发雪上加霜&#xff0c;房企股价遭遇集体下挫&#xff0c;业内公认的万科、龙湖、保利、中海等“优等生”也不免被波及。多家证券机构提醒&#xff0c;行业预期降至冰点的情况下&#xff0c…

【精华】maven 生命周期 + 依赖传递+ scope【依赖范围】 + 排除依赖 可选依赖

目录 一 . lifecycle 生命周期 二. 依赖 与 依赖传递 三. scope 依赖范围 scope指定依赖范围 依赖传递依赖与原依赖冲突 四 maven的可选依赖与排除依赖 可选依赖 全部 排除依赖 显式的指定 maven官网技术文档&#xff1a; 一 . lifecycle 生命周期 * clean&…

java密码强度校验

一、代码 Testpublic void test(){//包含数字、大小写字母&#xff0c;长度10-20位 String regular "^(?.*\\d)(?.*[a-z])(?.*[A-Z]).{10,20}$";String example1 "1234567891";System.out.println(example1.matches(regular)); //falseString exa…

Python numpy求均值、保留几位小数

import numpy as nplist_test [0.21, 0.32]print(f{np.mean(list_test):.2f}) #保留两位小数 print(f{np.mean(list_test):.3f}) #保留三位小数

从输入URL到页面呈现

1、url解析 1、1地址解析 http和tcp的关系 tcp&#xff1a;传输通道http&#xff1a;传输协议https&#xff1a;比http多了ssl或者tsl&#xff08;证书验证&#xff09;ftp&#xff1a;大文件传输 客户端与服务器直接传送数据&#xff0c;http相当于快递小哥&#xff0c;tcp…

openGauss学习笔记-12 openGauss 简单数据管理-UPDATE语句

文章目录 openGauss学习笔记-12 openGauss 简单数据管理-UPDATE语句12.1 语法格式12.2 参数说明12.3 示例 openGauss学习笔记-12 openGauss 简单数据管理-UPDATE语句 修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行&#xff0c;所有行或者指定的部分行。还可…

【自动化测试验证码处理】如何跳过验证码,直接自动登录呢?

在日常的测试过程中避免不了要遇到登录的测试&#xff0c;但是在登录时又常常遇到验证码&#xff0c;那么该如何跳过验证码&#xff0c;直接自动登录呢&#xff1f; 当前在市面上比较流行的方式有&#xff1a; &#xff08;1&#xff09;直接跳过验证码&#xff08;测试环境中…

快7月底了,让我康康有多少准备跳槽的

前两天跟朋友感慨&#xff0c;今年的铜三铁四、裁员、疫情影响导致好多人都没拿到offer!现在已经快7月底了&#xff0c;具体金九银十只剩下2个月。 对于想跳槽的职场人来说&#xff0c;绝对要从现在开始做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也…

Principle Component Analysis

简述PCA的计算过程 输入:数据集X={x1,x2,...,xn},需降到k维 ① 去中心化(去均值,即每个特征减去各自的均值) ② 计算协方差矩阵1/nX*X^T(1/n不影响特征向量) ③ 用特征值分解方法/SVD奇异值分解求解②协方差矩阵的特征值与特征向量 ④ 对特征值从大到小排序,选…

websocket发布到iis之后无法创建连接访问

在做websocket测试时在本地的服务可以正常访问&#xff0c;在调试成功之后发布到了iis中&#xff0c;发现无法连接&#xff0c;这时可能有以下几个原因。 WebSocket无法连接到IIS&#xff1a; IIS版本不支持WebSocket&#xff1a;IIS 8.0及更高版本才支持WebSocket&#xff0…