如何模拟高斯分布的随机数发生器?

在一些算法中,经常会用到随机数,最常用的随机数有两种,一是服从均匀分布的随机数,二是服从高斯分布(正态分布)的随机数。在标准C中并没有产生高斯分布的随机数发生器,只有服从均匀分布的随机数发生器rand(),那么如何通过rand()来模拟出高斯分布特征的伪随机数呢?这就是本文的话题。

实验原理:高斯分布的随机数在概率上服从高斯分布,如果通过rand()产生某个区间的随机数,通过高斯分布的概率计算公式得到该随机数对应的概率值,然后与一个随机概率进行比较,如果该概率值大于随机概率,就认为该随机数是服从高斯分布的随机数。

高斯分布随机数的参数:随机数的区间为[f_floor,f_ceil],mu为均值,sigma为std标准差

废话少说,直接上代码,基于Matlab进行的仿真实验:

%% 产生指定区间上服从正态分布的随机数
%% [f_floor,f_ceil],mu为均值,sigma为std标准差
%% 生成原理:用均匀rand生成该区间的x,然后计算对应的高斯概率,
%% 与随机概率比较,如果大于随机概率,则挑出来作为一个值
%%
%digits(50)%设定数字精度
f_floor = -10.0;
f_ceil = 10.0;
mu = 5;
sigma = 1;
N = 100000;
X = zeros(1,100);
for n = 1:N
prob = 0;
y = rand();
while prob < y;
    x = f_floor + (f_ceil - f_floor) * rand();
    prob = 1/sqrt(2*pi*sigma*sigma)*exp(-(x-mu)^2/sigma/sigma/2);
    y = rand();
end;
X(n) = x;
end;
plot(X);
hist(X,50)

实验结果如图所示:

实验结果分析:

通过统计直方图可以看出,通过这种机制生成的随机数大致满足区间为[f_floor,f_ceil],mu为均值,sigma为std标准差的高斯分布随机数。也就证明了算法的正确性。

高斯分布的随机数或者高斯噪声在现代数字信号处理中常常用到,而在一些开发平台并没有提供可以直接调用的高斯随机数发生器,因此就需要模拟出高斯随机数,而本文可以作为参照进行。

*************************************************************************************************************************************

2015-7-21

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 12:35:54

如何模拟高斯分布的随机数发生器?的相关文章

[nRF51822] 16、nRF51822的随机数生成器,及随机数生成器的一些知识(可以帮您补补随机数发生器的知识)

1.前言 随机数生成器在通信.加密.图像传输等领域应用广泛,且一般起到关键性作用.我在最近设计的一个近场射频通信协议的碰撞避退算法的过程中,便对此有深深体会. 2.伪随机数发生器 随机数发生器一般包括伪随机数发生器和真随机数发生器.伪随机数发生器的伪随机序列是由数学公式计算产生,如果生成随机数的算法确定了,那么这个随机数序列也就确定了.所以从数学意义上讲,伪随机数并不随机,序列本身也必然会重复.但是只要伪随机数发生器所产生的伪随机序列的周期足够成并且通过相应的检验,就可以在一定范围内使用.而且伪

随机数发生器

浅谈随机数发生器 目录(?)[-] 一真随机数发生器 基于电路的TRNG 基于其他物理源的TRNG 其他物理信息TRNG 二伪随机数发生器 取中法 i平方取中法 ii常数取中法 iii乘法取中法 同余法 移位法 梅森旋转算法 今 天在微博上到一篇如何使用随机数的文章,让我回忆起刚上大一时学C语言时,书后有道调用rand()函数的练习题,当时觉得好神奇,想知道它是怎么实现 的,大二时候学Java又遇到了random()函数,恰巧当时上机课我有机会问老师,遗憾的是老师只是告诉我那是伪随机数,课后查查

QuantLib 金融计算——数学工具之随机数发生器

目录 QuantLib 金融计算--数学工具之随机数发生器 概述 伪随机数 正态分布(伪)随机数 拟随机数 HaltonRsg SobolRsg 两类随机数的收敛性比较 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--数学工具之随机数发生器 载入模块 import QuantLib as ql import scipy print(ql.__version__) 1.12 概述 随机模拟通常从产生均匀分布的随机数开始.假设 \(X \sim U [0, 1

随机数发生器(对拍)-----对比测试

对于写好的程序,可能会花费较长的时间进行调试,所以要具备一定的调试和测试能力.测试的任务就是检查一份代码是否正确.如果找到了错误,最好还能提供一个让它错误的数据.有了错误数据之后,接下来的任务便是调试:找出出错的原因.如果找到了错,最好把它改对——至少对于刚才的错误数据能得到正确的结果.改对一组数据之后,可能还有其他错误,因此需要进一步测试:即使以前曾经正确的数据,也可能因为多次改动之后反而变错了,需要再次调试.总之,在编码结束后,为确保程序的正确性,测试和调试往往要交替进行. 确保代码正确的方

浅谈随机数发生器(C语言)

本文出自:点击打开链接 本来在做数据结构课程设计..想用随机数生成测试数据,然后看到随机数就不由自主的想到精度问题,想到精度问题又想到随机数生成的时间问题,想到时间问题又想到调用系统随机数生成问题..呵呵呵呵呵. C语言调用Linux系统随机数:linux C程序中获取shell脚本输出 C语言往里写就好说了(Linux) const char *run ="echo '"+str+"' > test"; system(run); 另外在Google比较难以访

一个随机数发生器(一)

老黄.老银和老阳共事宇宙中心某互联网企业H,并且同在一个由校招新生组成的Team里.刚走出校园的他们,对自己去年在校招这场演技大比拼中的表现意犹未尽,因此常会拿一些没什么实际意义的技术问题大谈特谈. 这次是午饭后的扯皮时间,这几个人就吸着免费的明胶酸奶,从一些概率问题讨论到了随机数发生器上…… 黄:像去年(校招),面试官就很喜欢问这种题目:给定一个[0, M)的均匀分布随机整数发生器(以下简称RNG),设计一个[0, N)的整数的均匀分布RNG. 阳:我被问的时候不知道怎么做,问我的人就得意的告

C#生成一个符合正态分布(高斯分布)的随机数

//随机产生一个符合正态分布的数 u均数,d为方差 public static double Rand(double u, double d) { double u1, u2, z, x; //Random ram = new Random(); if (d <= 0) { return u; } u1 = (new Random(GetRandomSeed())).NextDouble(); u2 = (new Random(GetRandomSeed())).NextDouble(); z

动手动脑:随机数发生器和函数重载

最近上课老师说出了一些随机数生成的方法,我通过上网查阅资料了解到其中有几种方法,一种是math.random方法这种方法被称为伪随机,也就是有规律的随机,有可能会出现重.第二种是用种子来进行随机数的产生.其中到用到了random类.这种方法通过不断更新种子的值来进行输出不同的随机数,这种生成方法再一次运行中对于不同的种子有不同的随机数值,也就是说对于相同的种子数值,他会有一样的数值来进行输出.种子数值相近的话生成的随机数也会很相近,这种原理,在以后的学习中我会进行进一步的学习. 下面是随机数发生

动手动脑(随机数发生器)

import java.util.Scanner; public class Random { public static void main(String[] args) { // TODO Auto-generated method stub System.out.print("输入你要获取的随机数个数:"); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt();//获取的随机数的个数 for(in