失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 利用独立同分布的中心极限定理生成正态分布的随机数

利用独立同分布的中心极限定理生成正态分布的随机数

时间:2018-07-23 22:39:43

相关推荐

利用独立同分布的中心极限定理生成正态分布的随机数

多数编程语言只提供一个生成[0,1] 区间上的均匀分布数组的函数。本人的目的在于介绍如何生成一个正态分布的随机数组

参考文献[1]指出了利用均匀分布生成正态分布的方法,即中心极限定理之独立同分布。

设随机变量相互独立,服从[0,1]区间上的均匀分布。则随机变量

当n足够大时,新的随机变量Y 满足标准正态分布。

但实际上,标准正态分布不一定能满足要求,也许需要的是满足正态分布(a,b)的随机数组。

这时就应该进行一些必要的运算。

对于均值,只需要对最终结果进行相加或者相减

对于方差的变换可以简单的将结果乘上一个系数

由正态分布的定义出发,可以证明若则

已知随机变量X 服从参数为的正态分布,则随机变量X 概率密度函数为

令,则有

接下来,我们通过C++实现这一过程

//该程序用于实现生成一组正态分布的随机数//作者cclplus 我的邮箱是maxwell970710@ 如有问题可以发送到我的邮箱,我会尽可能为您解答#include "stdafx.h"#include <iostream>#include <cmath>#include <ctime>using namespace std;double rand_normal(double r_me, double sd);//返回一个方差为r_me,标准差为sd的随机数int main(){double ans;double r_mean, r_sd;int n;cout << "请依次输入所需要正态分布随机数的均值和标准差" << endl;cin >> r_mean >> r_sd;cout << "请输入需要随机数的个数" << endl;cin >> n;for (int i = 0; i < n; i++) {ans = rand_normal(r_mean, r_sd);cout << "随机数:" << ans << endl;}return 0;}double rand_normal(double r_me, double sd) {int i;const int normal_count = 360;//样本数目采用360个double ccl_num, ccl_s;double ccl_ar[normal_count];ccl_num = 0;for (i = 0; i < normal_count; i++) {ccl_ar[i] =rand() % 1000/ (double)999;//生成一个[0,1]的均匀分布ccl_num += ccl_ar[i];}ccl_num -= ((double)normal_count*0.5);//减去0-1均匀分布的均值ccl_s = 1.0*(double)normal_count / 12.0;//0-1分布的方差为1/12ccl_s = sqrt(ccl_s);ccl_num /= ccl_s;//此时ccl_num接近标准正态分布的一个子集ccl_num *= sd;ccl_num += r_me;return ccl_num;}

【参考文献】

[1]王桂松,张忠占,程维虎等 概率论与数理统计.[M] 110-110 140-141

如果觉得《利用独立同分布的中心极限定理生成正态分布的随机数》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。