基于Box-Muller算法的高斯分布随机数产生方法

为了产生高斯分布随机数,有必要先讲讲均匀分布随机数的产生。本文正是采用Box-Muller算法实现高斯分布的,而要借助Box-Muller算法产生高斯分布必须要有现成的均与分布随机数。由此算是真正体验了一把算法是程序的灵魂,感叹算法确实太重要!

一,均匀分布的产生思路和方法:

首先我们必须借助于rand()函数产生一个随机数,必须由这源源不断的无规律的随机数去构造满足其他符合规律的随机数,当然高斯分布就是这其中的一种规律。但是由rand()函数产生的随机数在程序执行过程中总是不变的,所以如果想要产生大量的随机数,rand()必须做一下处理,一种常规的很有效的方式就是将rand()函数植入系统时间种子,代码如下:

srand((unsigned)time(NULL));
x=rand();

使用这个srand()函数必须将最终的源代码加上头文件,#include "time.h"。

先假定我们只产生了一个随机数的最简单情况,因为产生批量的成千上万的随机数只是重复同一过程而已。一个均匀分布随机数子函数的实现代码如下:

double UNIFORM(){int x;    double y;srand((unsigned)time(NULL));x=rand();      //x就是由基于系统时钟产生的随机数,一个典型的可能的取值可以是:134238y=(float)(x0);    //这个随机数和100求余的结果必然得到一个小与100的整数,然后强制转换成浮点数y=y/100;    //这个数除以100,会得到一个小与1的数。return y;
} 

由这个函数产生的随机数是介于(0,1)之间的,理论上可以产生(0,1)之间的任何数,并且任何两个数的取值概率从统计上来讲必然相等,所以返回的y必然就服从均匀分布。

二,Box-Muller算法:

Box-Muller算法正是利用均匀分布产生高斯分布随机数,算法如下:

上式中的U1和U2就是两个均匀分布随机数,经过这样的一种计算之后就能产生一个Z服从均匀分布的随机数,这看起来太神奇了,不得不佩服这个算法。说明一下,上面的三个式子,前两个取任何一个都可以用作算法,取正弦还是余弦是无所谓的。另外一点,上面的式子仅仅只能产生标准的高斯分布,若要产生给定的均值和方差其实也很简单。

Y=u+(Z*sigma)

上式中的u,sigma就是可以自己手动定义的期望和方差。

好了,基于这个算法,我批量的产生了10000个数,来看看最终的程序代码。

三,完整程序代码:

#include <iostream>
#include <time.h>
#include <iomanip>
#include <math.h>
#include <fstream>
#define PI 3.14159
using namespace std;
void UNIFORM(double *);  //UINFORM函数声明
int x = 0;   //这里定义x一个全局变量并且初始付值0,这个的功用将会在子函数UNIFORM中得以体现
int main()
{int i, j;double A, B, C, E, D, r;double uni[2];double *p;srand((unsigned)time(NULL));  //随机数种子采用系统时钟ofstream outfile("Gauss.txt", ios::out);  //定义文件对象cout << "输入期望和方差:" << endl;cin >> E >> D;for (j = 0; j<10000; j++){UNIFORM(&uni[0]);  //调用UNIFORM函数产生2个均匀分布的随机数并存入数组nui[2]A = sqrt((-2)*log(uni[0]));B = 2 * PI*uni[1];C = A*cos(B);r = E + C*D;    //E,D分别是期望和方差outfile << r << "   ";  //将数据C输出到被定义的文件中}return 0;
}
void UNIFORM(double *p)
{int i, a;double f;for (i = 0; i<2; i++, x = x + 689){a = rand() + x;  //加上689是因为系统产生随机数的更换频率远远不及程序调用函数的时间a = a%1000;f = (double)a;f = f / 1000.0;*p = f;p++;}
}

由于本程序执行之后会产生10000个数据,所以没有让他在终端中展示出来,而是利用  outfile<<r<<"   ";指令将所有数据输出到F:\VC6.0\MSDev98\Bin\Gauss.txt记事本文件中。这是为了便于做Matlab统计仿真的需要。我执行了两次程序,输入期望和方差为(0,1)和(0,4)。

四,Matlab仿真结果:

N(0,1)

N(0,4)

Matlab读入利用C++程序产生的Gauss.txt文本文件绘制直方图的代码如下:

load F:\VC6.0\MSDev98\Bin\Gauss.txt;   %读入数据文件
y=Gauss;
x=-20:0.2:20;
hist(y,x);    %绘制直方图

五,小结: 

纵观其实整个过程很简单,最关键的只有两点,一是均匀分布产生的方法,二是套用Box-Muller算法作为整个程序的灵魂。还是那句话,不得不承认算法才是王道。另外由于我习惯了C++,所以程序用的C++写的,其实用C完全可以,两者的区别在这个小程序里仅仅体现在头文件,输入输出语句,文件操作语句这一点点差别而已。

C++高斯分布随机数的产生相关推荐

  1. java高斯分布随机数_生成符合高斯分布或者其他任意分布的随机数

    在一些情况下经常需要用到随机数,而高斯随机数又是最常用到的.这一篇讲一下如何编程生成符合正态分布的高斯随机数,甚至任何其他分布的随机数. 我们知道C语言的标准库函数可以生成符合均匀分布的伪随机数.那么 ...

  2. 高斯分布的随机数生成器

    高斯分布的随机数生成器 实现的过程是先查找相关高斯分布随机数在vivado实现的博客,先大概认识一下,然后到知网找相关的硕士论文,总结出最简单的高斯随机数生成的实现方法,在进行仿真验证. 在查阅相关论 ...

  3. c++产生均匀分布随机数赋值_不随机的随机数:高斯随机数生成器综述

    随机数的使用非常广泛,例如在从统计总体中抽取有代表性的样本时,或者在将实验动物分配到不同的试验组的过程中,或者在进行蒙特卡洛模拟法计算的时候等等.事实上,这些统计技术中使用的随机数均为"伪随 ...

  4. 我所理解的卡尔曼滤波——公式推导与应用

    我所理解的卡尔曼滤波--公式推导与应用 1.什么是卡尔曼滤波 2.卡尔曼滤波的数学推导 2.1 状态方程和测量方程 2.2 卡尔曼滤波过程 3 卡尔曼滤波应用 1.什么是卡尔曼滤波 先举个例子说一下什 ...

  5. Caffe源码中math_functions文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下math_functions文件. 1.      include文件: ...

  6. 12、OpenCV实现图像的空间滤波——图像平滑

    1.空间滤波基础概念 1.空间滤波基础 空间滤波一词中滤波取自数字信号处理,指接受或拒绝一定的频率成分,但是空间滤波学习内容实际上和通过傅里叶变换实现的频域的滤波是等效的,故而也称为滤波.空间滤波主要 ...

  7. 百面机器学习之特征工程

    1.为什么需要对数值类型的特征做归一化? 为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使得不同指标之间具有可比性. 对数值类型的特征做归一化可以将所有的特征都统一到一个大致相同的数值 ...

  8. 【OpenCV 4开发详解】图像噪声的种类与生成

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  9. matlab imnoise 用法,怎样使在matlab用imnoise函数啊 对图像有什么要求才能用imnoise函数...

    答:% 可以直接用,doc imnoise rgb = imread('000.jpg'); rgb2 = imnoise(rgb,'gaussian'); subplot(121); imshow( ...

最新文章

  1. nexus搭建maven私服
  2. Java 增强型的for循环 for each
  3. Android项目出现main.xml编译出错和 出现main.out.xml无法编译的解决办法
  4. HTTP面试题都在这里
  5. Jenkins的Pipeline脚本在美团餐饮SaaS中的实践
  6. leetcode| 94. 二叉树的中序遍历
  7. 提高网站第一次加载速度
  8. 常见花材的固定的方法有哪些_什么是zeta电位?常见zeta电位分析方法有哪些?...
  9. 常用方法总结--文件操作篇
  10. 【牛客网小白月赛12】华华听月月唱歌(贪心+区间覆盖问题)
  11. 廖雪峰git教程总结
  12. Android增量更新
  13. js生成二维码并下载、批量生成二维码和压缩下载
  14. 【高等数学笔记】闭包、孤立点、导集、内点、边界的关系
  15. 当BTC大空头遇上PlusToken,投资竟然成为一门玄学?
  16. ecshop后台首页mysql_ECSHOP后台自带数据库管理
  17. 巴菲特对优质公司买卖
  18. Container killed by YARN for exceeding memory limits
  19. 编写ASCOM平台的驱动
  20. ajax请求失败readyState为0

热门文章

  1. 事务的传播行为(讲得比较好)
  2. 评DeepMind神经网络求解MIP论文:并非无所不能
  3. 如何使用Categories
  4. 亚马逊测评自养号,小白应该如何开始?
  5. springboot整合ActiveMQ(点对点和发布订阅)
  6. CUDA学习(二)-NVCC的编译过程及命令
  7. FMX和VCL混用时RegisterClass无法GetClass或FindClass的问题
  8. 微信开发sdk非ipad协议(厉害)
  9. 凸优化学习(二)——凸集
  10. GC5958三相无刷(BLDC)无感正弦波电机驱动芯片 替代APX9358