利用独立同分布的中心极限定理生成正态分布的随机数
程序员文章站
2022-07-10 23:33:33
...
多数编程语言只提供一个生成[0,1] 区间上的均匀分布数组的函数。本人的目的在于介绍如何生成一个正态分布的随机数组
参考文献[1]指出了利用均匀分布生成正态分布的方法,即中心极限定理之独立同分布。
设随机变量相互独立,服从[0,1]区间上的均匀分布。则随机变量
当n足够大时,新的随机变量Y 满足标准正态分布。
但实际上,标准正态分布不一定能满足要求,也许需要的是满足正态分布(a,b)的随机数组。
这时就应该进行一些必要的运算。
对于均值,只需要对最终结果进行相加或者相减
对于方差的变换可以简单的将结果乘上一个系数
由正态分布的定义出发,可以证明若 则
已知随机变量X 服从参数为的正态分布,则随机变量X 概率密度函数为
令 ,则有
接下来,我们通过C++实现这一过程
//该程序用于实现生成一组正态分布的随机数
//作者cclplus 我的邮箱是[email protected] 如有问题可以发送到我的邮箱,我会尽可能为您解答
#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/12
ccl_s = sqrt(ccl_s);
ccl_num /= ccl_s;//此时ccl_num接近标准正态分布的一个子集
ccl_num *= sd;
ccl_num += r_me;
return ccl_num;
}
【参考文献】
[1]王桂松,张忠占,程维虎等 概率论与数理统计.[M]2014 110-110 140-141
上一篇: Pandas数据分析的环境准备
下一篇: cdr利用智能绘图工具绘制漂亮的图案