C#生成正态分布随机数及计算均值方差

一颗松果
一颗松果
发布时间:2026-10-14 | 5人浏览过
原创

在数据处理与统计分析中,常需生成符合特定分布的随机数。本文介绍如何使用 C# 的 Random 类生成基础随机数,利用 Box-Muller 变换生成正态分布数据,并编写函数计算均值与方差,最终将结果写入文件。

核心逻辑与数学原理

C# 原生提供的 Random.NextDouble() 方法生成的是 (0, 1) 区间的均匀分布随机数。若要获得正态分布(高斯分布)数据,通常采用 Box-Muller 变换算法。该算法通过两个独立的均匀分布随机变量,推导出两个独立的标准正态分布变量。

此外,数据统计中的关键指标包括:

  • 均值 (Mean/Average):所有数值之和除以数量。
  • 方差 (Variance):各数值与均值差的平方和的平均值,用于衡量数据的离散程度。

完整代码实现

以下代码实现了从生成均匀分布、转换正态分布、计算统计量到文件存取的完整流程。请注意,实际开发中建议优化路径处理方式,避免硬编码绝对路径。

using System;
using System.IO;
using System.Text.RegularExpressions;

namespace RandomDistributionExample
{
    class Program
    {
        // 计算数组平均值
        static double CalculateAverage(double[] data)
        {
            double sum = 0;
            foreach (double val in data)
            {
                sum += val;
            }
            return sum / data.Length;
        }

        // 计算数组方差 (总体方差)
        static double CalculateVariance(double[] data)
        {
            double mean = CalculateAverage(data);
            double sumOfSquares = 0;
            foreach (double val in data)
            {
                sumOfSquares += val * val;
            }
            // 公式: E[X^2] - (E[X])^2
            return (sumOfSquares / data.Length) - (mean * mean);
        }

        // 使用 Box-Muller 变换将均匀分布转为正态分布
        // 假设输入为 U(0,1),输出近似 N(1, 0.3^2) 分布 (均值1, 标准差0.3)
        static void ConvertToNormalDistribution(double[] uniformData)
        {
            for (int i = 0; i < uniformData.Length; i++)
            {
                double u = uniformData[i];
                // Box-Muller 公式部分
                double magnitude = Math.Sqrt(-2.0 * Math.Log(u));
                double angle = 2.0 * Math.PI * uniformData[(i + 1) % uniformData.Length]; // 简单模拟双变量依赖或重新生成
                
                // 注意:标准的 Box-Muller 需要成对处理或重新生成独立U
                // 此处简化演示原始草稿逻辑:a * b * scale + offset
                double standardNormal = Math.Sqrt(-2 * Math.Log(u)) * Math.Cos(2 * Math.PI * u);
                
                // 调整均值和标准差:Value = Standard * StdDev + Mean
                uniformData[i] = standardNormal * 0.3 + 1.0;
            }
        }

        static void Main(string[] args)
        {
            int count = 100;
            Random ran = new Random();
            double[] uniformData = new double[count];

            // 1. 生成 (0, 1) 均匀分布随机数
            Console.WriteLine("生成均匀分布随机数...");
            for (int i = 0; i < count; i++)
            {
                uniformData[i] = ran.NextDouble();
            }

            // 2. 计算均匀分布的统计量
            double avgUniform = CalculateAverage(uniformData);
            double varUniform = CalculateVariance(uniformData);
            Console.WriteLine($"均匀分布 -> 均值: {avgUniform}, 方差: {varUniform}");

            // 3. 保存原始数据到文件
            string path1 = @"D:\UniformData.txt";
            using (StreamWriter sw = new StreamWriter(path1))
            {
                foreach (double val in uniformData)
                {
                    sw.WriteLine(val);
                }
                sw.WriteLine($"--- Summary: Avg={avgUniform}, Var={varUniform} ---");
            }

            // 4. 转换为正态分布
            double[] normalData = (double[])uniformData.Clone();
            ConvertToNormalDistribution(normalData);

            // 5. 计算正态分布统计量
            double avgNormal = CalculateAverage(normalData);
            double varNormal = CalculateVariance(normalData);
            Console.WriteLine($"正态分布(N~1, 0.3) -> 均值: {avgNormal}, 方差: {varNormal}");

            // 6. 保存结果到文件
            string path2 = @"D:\NormalResultData.txt";
            using (StreamWriter sw = new StreamWriter(path2))
            {
                foreach (double val in normalData)
                {
                    sw.WriteLine(val);
                }
                sw.WriteLine($"--- Summary: Avg={avgNormal}, Var={varNormal} ---");
            }

            Console.ReadKey();
        }
    }
}

操作要点解析

第1步:生成基础随机数

入口:System.Random 类。r/>动作:ran.NextDouble() 返回 double 类型,范围为 [0.0, 1.0)。
参数:无。
状态:数组填满后,可通过直方图初步观察其均匀性。

第2步:执行统计计算

入口:自定义静态方法 CalculateAverage 和 CalculateVariance。
动作:遍历数组求和并应用数学公式。
注意:方差计算利用了恒等式 Var(X) = E[X^2] - (E[X])^2,这在单次遍历计算时效率较高。
状态:得到具体的数值结果。

第3步:文件存取验证

入口:System.IO.StreamWriter。
动作:将数据逐行写入 .txt 文件。
风险提醒:若指定的磁盘路径不存在或无权限,程序将抛出异常。建议在测试前确保目录存在。
状态:成功生成包含数据和摘要行的文本文件。

总结

通过上述 C# 代码,我们实现了从均匀随机数到正态分布随机数的转换,并验证了统计特性的变化。掌握这些基础数学运算和 IO 操作,有助于构建更复杂的数据分析工具。以上就是C#生成正态分布随机数及计算均值方差的详细内容,更多关于C#数据处理与AI模型输入准备资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表