• 主页
  • 搞机
  • 留言
  • 关于
  • 笔记
  • 时光
所有文章 友链 关于本站

  • 主页
  • 搞机
  • 留言
  • 关于
  • 笔记
  • 时光

使用C#产生各种随机数(一)

2017-12-17

在很多时候,我们需要用到各种各样的随机数,比如平均分布、正态分布、泊松分布、指数分布等等。

在网上找了很多资料,终于集齐了一套,这里做一下笔记,希望以后再用的时候能记起来。

因为篇幅比较长,本篇文章先介绍一下平均分布和正态分布,剩下的内容留给下一篇文章。

平均分布➴

平均分布的随机数产生是最容易的,我们可以直接使用.net的随机数产生类System.Random产生符合平均分布的随机数。
当然,Unity重也可以使用UnityEngine.Random产生随机数。

原理➴

这个原理的话,就是伪随机数产生的原理,首先需要给定一个随机因子,然后以这个随机因子为基础,进行一系列的运算,然后产生一个伪随机数,如果不给定随机因子,就会使用当前的系统时间进行计算。

演示➴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;

namespace RandomDemo
{
public class U
{
Random rand = new Random();

public int U0(int min ,int max)
{
var a = rand.Next(min ,max);
return(a);
}
}
}

使用上面的代码,不指定随机因子产生随机数,然后使用for循环产生9000个 -50 - 50 之间的随机数;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;

namespace RandomDemo
{
class Program
{
static void Main(string[] args)
{
U u = new U();

for (int i = 0; i < 9000; i++)
{
var a = u.U0(-50, 50);
Console.WriteLine(a);
}

Console.ReadKey();
}
}
}

接下来使用Origin统计分布频度,作图:

可以看出,基本符合平均分布特点(样品越多,统计结果越准确,有兴趣的话可以弄100K个样本试试看有什么效果)。

正态分布➴

若随机变量X服从一个数学期望为μ、方差为σ^2的正态分布,记为N(μ,σ^2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。

原理➴

极坐标形式

假设u 和 v 是 [-1, 1] 均匀分布的随机量,且u 和 v 彼此独立,令:

那么随机数z0 和 z1可以按照如下公式产生,结果是z0 和 z1服从N(0,1)的随机数,且 z0 和 z1彼此独立;
m6tOY.png
m66ei.png
有兴趣的同学可以看一下这一段 原文链接;

演示➴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;

namespace RandomDemo
{
public class N
{
Random rand = new Random();

//标准正态分布
public double Normal()
{
double s = 0, u = 0, v = 0;
while (s > 1 || s == 0)
{
u = rand.NextDouble() * 2 - 1;
v = rand.NextDouble() * 2 - 1;

s = u * u + v * v;
}

var z = Math.Sqrt(-2 * Math.Log(s) / s) * u;
return (z);
}

//符合要求的正态分布随机数
public double RandomNormal(double miu ,double sigma)
{
var z = Normal() * sigma + miu;
return (z);
}
}
}

同样,我们使用9000个随机数验证随机数分布规律

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;

namespace RandomDemo
{
class Program
{
static void Main(string[] args)
{
N n = new N();

for (int i = 0; i < 9000; i++)
{
var z = n.RandomNormal(0, 10);
Console.WriteLine(z);
}

Console.ReadKey();
}
}
}

使用Origin作图,并使用高斯方程拟合曲线可以得到下图:

从图中我们可以看出,分布中心μ接近0,而σ接近10(9.885),基本符合我们的预期。

下期预告➴

以后有时间会接着介绍泊松分布和指数分布随机数的产生方法。

赏

请作者吃辣条

支付宝
微信
  • 本文作者: MonoLogueChi
  • 本文链接: https://blog.xxwhite.com/2017/RandomNum1.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
  • Unity
加个Valine评论系统
安卓折腾Linux

获取文章MarkDown文件 本文阅读量 8848
  1. 1. 平均分布
    1. 1.1. 原理
    2. 1.2. 演示
  2. 2. 正态分布
    1. 2.1. 原理
    2. 2.2. 演示
  3. 3. 下期预告
© 2015-2021 MonoLogueChi
蒙ICP备17004911号-1
Hexo Theme Yilia by Litten
本站由 提供CDN加速/云存储服务
  • 所有文章
  • 友链
  • 关于本站

tag:

  • 搞机
  • 建站笔记
  • Unity
  • 测试
  • 随便水水
  • C#
  • 涨姿势
  • 软件
  • 炎黄幼儿园
  • 小工具
  • 香橙派
  • 服务器
  • 个人电脑
  • dotnet
  • Linux
  • 硬件
  • 软路由
  • NAS
  • OMV
  • timeline
  • 叉叉白
  • 大姐姐的博客Minemine
  • 酷安基佬
  • Se7en
  • 姬长信
  • staunchkai
  • 随遇而安
  • 2401的晚秋咖啡
  • CareyQ
  • Junzhou Liu
  • Yi-Yun
  • LmCjl在线工具
  • Freetao’s Blog
叉叉白 一个小白搞机的记事本