欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 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