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

    

    多数编程语言只提供一个生成[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

猜你喜欢

转载自blog.csdn.net/m0_37772174/article/details/81054183
今日推荐