利用独立同分布的中心极限定理生成正态分布的随机数
生活随笔
收集整理的這篇文章主要介紹了
利用独立同分布的中心极限定理生成正态分布的随机数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
????
????多數編程語言只提供一個生成[0,1] 區間上的均勻分布數組的函數。本人的目的在于介紹如何生成一個正態分布的隨機數組
????參考文獻[1]指出了利用均勻分布生成正態分布的方法,即中心極限定理之獨立同分布。
設隨機變量相互獨立,服從[0,1]區間上的均勻分布。則隨機變量
?
當n足夠大時,新的隨機變量Y 滿足標準正態分布。
但實際上,標準正態分布不一定能滿足要求,也許需要的是滿足正態分布(a,b)的隨機數組。
這時就應該進行一些必要的運算。
對于均值,只需要對最終結果進行相加或者相減
對于方差的變換可以簡單的將結果乘上一個系數
由正態分布的定義出發,可以證明若?則
?
已知隨機變量X? 服從參數為的正態分布,則隨機變量X 概率密度函數為
令?,則有
接下來,我們通過C++實現這一過程
//該程序用于實現生成一組正態分布的隨機數 //作者cclplus 我的郵箱是maxwell970710@gmail.com 如有問題可以發送到我的郵箱,我會盡可能為您解答 #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]2014 110-110 140-141
總結
以上是生活随笔為你收集整理的利用独立同分布的中心极限定理生成正态分布的随机数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ATSENet论文阅读笔记
- 下一篇: ecshop二次开发目录文档【文件结构说