C#生成正态分布随机数及计算均值方差
在数据处理与统计分析中,常需生成符合特定分布的随机数。本文介绍如何使用 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模型输入准备资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













