C#,《小白学程序》第十六课:随机数(Random)第三,正态分布的随机数的计算方法与代码

1 随机数的问题

用 C# Random 类生成的随机数是平均分布的。也就是各数据段的出现的次数差不多。彩票号码属于这种随机数。

而很多很多常见的随机数,比如:成绩,却是符合正态分布的。

因而很多时候需要生成符合正态分布规律的随机数。

2 文本格式的程序

// 定义一个全局性(公共)的随机数发生器,便于大家(各函数)后面共同使用。

Random global_rnd = new Random();

/// <summary>

/// Box-Muller算法

/// 随机产生一个符合正态分布的数 u均数,d为标准方差

/// 注:本算法来自于网络,原文 d 为方差,错误!

/// </summary>

/// <param name="u"></param>

/// <param name="d"></param>

/// <returns></returns>

public double Rand(double u, double d)

{

double u1, u2, z, x;

if (d <= 0)

{

return u;

}

u1 = global_rnd.NextDouble();

u2 = global_rnd.NextDouble();

z = Math.Sqrt(-2 * Math.Log(u1)) * Math.Sin(2 * Math.PI * u2);

x = u + d * z;

return x;

}

/// <summary>

/// 《小白学程序》第十六课:随机数(Random)第三,正态分布的随机数的计算方法与代码

/// 一般的随机数是平均分布的,不符合常见的随机数分布,比如:成绩。

/// 因而很多时候需要生成符合正态分布规律的随机数

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void button16_Click(object sender, EventArgs e)

{

// 生成随机数,并统计,代码与前一课差不多

int n = 360;

int\[\] freq = new intn;

for (int i = 0; i < 10000; i++)

{

// 调用 Rand() 生成符合正态分布的随机数

int a = (int)(Rand(0.5, 0.1) * n);

if (a < 0) continue;

if (a >= n) continue;

freqa += 1;

}

// 显示统计结果 与 前面一节课 的类似

// 方柱 的高度就是数字出现的次数(频率)

StringBuilder sb = new StringBuilder();

sb.AppendLine("<style>td { padding:0px;text-align:center;text-size:0px; } </style>");

sb.AppendLine("<table width=420 border=0 style='border-collapse:collapse;'>");

sb.AppendLine("<tr>");

for (int i = 0; i < n; i++)

{

sb.Append("<td style='vertical-align:bottom;'>");

sb.Append("<div style='width:3px;height:" + freqi + "px;border:solid 1px #FF0000;background-color:rgb(255,255,0);'></div>");

sb.AppendLine("</td>");

}

sb.AppendLine("</tr>");

sb.AppendLine("</table>");

webBrowser1.DocumentText = sb.ToString();

}

3 代码格式

cs 复制代码
// 定义一个全局性(公共)的随机数发生器,便于大家(各函数)后面共同使用。
Random global_rnd = new Random();

/// <summary>
/// Box-Muller算法
/// 随机产生一个符合正态分布的数 u均数,d为标准方差
/// 注:本算法来自于网络,原文 d 为方差,错误!
/// </summary>
/// <param name="u"></param>
/// <param name="d"></param>
/// <returns></returns>
public double Rand(double u, double d)
{
    double u1, u2, z, x;
    if (d <= 0)
    {
        return u;
    }
    u1 = global_rnd.NextDouble();
    u2 = global_rnd.NextDouble();
    z = Math.Sqrt(-2 * Math.Log(u1)) * Math.Sin(2 * Math.PI * u2);
    x = u + d * z;
    return x;
}

/// <summary>
/// 《小白学程序》第十六课:随机数(Random)第三,正态分布的随机数的计算方法与代码
/// 一般的随机数是平均分布的,不符合常见的随机数分布,比如:成绩。
/// 因而很多时候需要生成符合正态分布规律的随机数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button16_Click(object sender, EventArgs e)
{
    // 生成随机数,并统计,代码与前一课差不多
    int n = 360;
    int[] freq = new int[n];
    for (int i = 0; i < 10000; i++)
    {
        // 调用 Rand() 生成符合正态分布的随机数
        int a = (int)(Rand(0.5, 0.1) * n);
        if (a < 0) continue;
        if (a >= n) continue;
        freq[a] += 1;
    }

    // 显示统计结果 与 前面一节课 的类似
    // 方柱 的高度就是数字出现的次数(频率)
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("<style>td { padding:0px;text-align:center;text-size:0px; } </style>");
    sb.AppendLine("<table width=420 border=0 style='border-collapse:collapse;'>");
    sb.AppendLine("<tr>");
    for (int i = 0; i < n; i++)
    {
        sb.Append("<td style='vertical-align:bottom;'>");
        sb.Append("<div style='width:3px;height:" + freq[i] + "px;border:solid 1px #FF0000;background-color:rgb(255,255,0);'></div>");
        sb.AppendLine("</td>");
    }
    sb.AppendLine("</tr>");
    sb.AppendLine("</table>");

    webBrowser1.DocumentText = sb.ToString();
}

4 运行结果(正态分布

相关推荐
元Y亨H3 分钟前
深度解构:数据结构与算法的理论基石与工程演进
数据结构·算法
元Y亨H17 分钟前
数据结构与算法的通俗指南
数据结构·算法
2301_7644413331 分钟前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模
林泽毅33 分钟前
PyTRIO快速入门(二):Datum构建
人工智能·算法·产品
吃好睡好便好1 小时前
MATLAB中图像的读取、写入和显示
开发语言·图像处理·学习·计算机视觉·matlab
keep intensify1 小时前
最长有效括号
算法·leetcode·动态规划
CoderYanger1 小时前
A.每日一题:1979. 找出数组的最大公约数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
yaoxin5211231 小时前
476. Java 反射 - 调用方法
java·开发语言
猫头虎1 小时前
什么是ZCode for GLM-5.2?
开发语言·人工智能·python·科技·算法·ai编程·ai写作
长不胖的路人甲2 小时前
什么是赫夫曼树(哈夫曼树 / Huffman Tree)
python·算法·霍夫曼树