采用混合同余法用C产生标准高斯分布的伪随机数

一、产生0-1均匀分布数

采用混合同余法,xi(axi1c)modM,yixi/M,yi即为一个在

0~1之间的随机数。通常情况下,选取a2045,c1,M220,我们任意给定一个初始值xi1,即可得到一个随机数,在程序中采用指针变量*s,

使得每次产生的随机数都不一样,只要改变循环的次数,就可以得到任意多个0~1随机数。

程序实现代码如下:

double x1(double a,double b, int *s)

{ double t;

*s=2045*(*s)+1;

*s=*s-(*s/1048576)*1048576;

t=(*s)/1048576.0;

return(t);

}

二、产生标准高斯分布数

标准的高斯分布均值=0,方差=1;根据中心极限定理有ziyi0.6,根据此式可以由12个0~1分布数产生一个高斯数。改变i112

循环次数可以得到任意多个标准高斯分布数。

程序实现代码如下:

int main()

{

double mean,sigma;

double x[100];

int i,j;

int s;

mean=0.0;

sigma=1.0;

s=19444;

cout

for(j=0;j

{

x[j]=0;

for(i=0;i

{

x[j]=x[j]+x1(mean,sigma,&s);

}

x[j]=x[j]-6.0;

printf("%13.7f",x[j]);

if((j+1)%5==0)

{cout

}

cout

产生一百个高斯数:

三、由得到的高斯分布数绘制概率密度函数

采用API图形处理中的Rectangle矩阵绘制函数绘制图形,将得到的高斯数分成一个个小区间,计算每个区间内的高斯数的个数,

用这

些个数作为矩阵的高.

得到结果图如下:

附录:程序源代码:

#include

#include

#include

#include

#include

#include

#include

#include

long WINAPI WndProc(HWND hWnd,UINTiMessage,UINTwParam,LONGlParam); BOOL InitWindowsClass(HINSTANCE hInstance);

BOOL InitWindows(HINSTANCE hInstance,intnCmdShow);

int WINAPI WinMain(HINSTANCE

hInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow) {

MSG Message; if(!InitWindowsClass(hInstance)) return FALSE; return FALSE; if(!InitWindows(hInstance,nCmdShow)) while

(GetMessage(&Message,0,0,0))

}

} returnMessage.wParam; TranslateMessage(&Message); DispatchMessage(&Message);

long WINAPI WndProc(HWND hWnd,UINTiMessage,UINTwParam,LONGlParam) {

HDC hDC; HBRUSH hBrush; HPEN hPen; PAINTSTRUCT PtStr; ////////////////////////////

double x1(doublea,double b, int *s);

double mean=0,sigma=1.0;

double x[10000],b[10000]={0};

inti,j;

int s1;

int k;

s1=19444;

for(j=0;j

{

x[j]=0;

for(i=0;i

{

x[j]=x[j]+x1(mean,sigma,&s1); x[j]=x[j]-6.0; for(i=0;ix[i]) b[j]=b[j]+1; } }

}

SelectObject(hDC,hBrush); SelectObject(hDC,hPen); /////////////////////// } //////////////////////////////////////////// for(k=0;k

BOOL InitWindows(HINSTANCE hInstance,intnCmdShow) {

} HWND hWnd; hWnd=CreateWindow("WinFill", "高?斯1分¤?布?", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); return FALSE; if(!hWnd) ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); return TRUE;

BOOL InitWindowsClass(HINSTANCE hInstance) {

}

double x1(doublea,double b, int *s) { double t;

*s=2045*(*s)+1;

*s=*s-(*s/1048576)*1048576;

t=(*s)/1048576.0;

return(t);

} WNDCLASS WndClass; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,"END"); WndClass.hInstance=hInstance; WndClass.lpfnWndProc=WndProc; WndClass.lpszClassName="WinFill"; WndClass.lpszMenuName=NULL; WndClass.style=CS_HREDRAW|CS_VREDRAW; returnRegisterClass(&WndClass);

一、产生0-1均匀分布数

采用混合同余法,xi(axi1c)modM,yixi/M,yi即为一个在

0~1之间的随机数。通常情况下,选取a2045,c1,M220,我们任意给定一个初始值xi1,即可得到一个随机数,在程序中采用指针变量*s,

使得每次产生的随机数都不一样,只要改变循环的次数,就可以得到任意多个0~1随机数。

程序实现代码如下:

double x1(double a,double b, int *s)

{ double t;

*s=2045*(*s)+1;

*s=*s-(*s/1048576)*1048576;

t=(*s)/1048576.0;

return(t);

}

二、产生标准高斯分布数

标准的高斯分布均值=0,方差=1;根据中心极限定理有ziyi0.6,根据此式可以由12个0~1分布数产生一个高斯数。改变i112

循环次数可以得到任意多个标准高斯分布数。

程序实现代码如下:

int main()

{

double mean,sigma;

double x[100];

int i,j;

int s;

mean=0.0;

sigma=1.0;

s=19444;

cout

for(j=0;j

{

x[j]=0;

for(i=0;i

{

x[j]=x[j]+x1(mean,sigma,&s);

}

x[j]=x[j]-6.0;

printf("%13.7f",x[j]);

if((j+1)%5==0)

{cout

}

cout

产生一百个高斯数:

三、由得到的高斯分布数绘制概率密度函数

采用API图形处理中的Rectangle矩阵绘制函数绘制图形,将得到的高斯数分成一个个小区间,计算每个区间内的高斯数的个数,

用这

些个数作为矩阵的高.

得到结果图如下:

附录:程序源代码:

#include

#include

#include

#include

#include

#include

#include

#include

long WINAPI WndProc(HWND hWnd,UINTiMessage,UINTwParam,LONGlParam); BOOL InitWindowsClass(HINSTANCE hInstance);

BOOL InitWindows(HINSTANCE hInstance,intnCmdShow);

int WINAPI WinMain(HINSTANCE

hInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow) {

MSG Message; if(!InitWindowsClass(hInstance)) return FALSE; return FALSE; if(!InitWindows(hInstance,nCmdShow)) while

(GetMessage(&Message,0,0,0))

}

} returnMessage.wParam; TranslateMessage(&Message); DispatchMessage(&Message);

long WINAPI WndProc(HWND hWnd,UINTiMessage,UINTwParam,LONGlParam) {

HDC hDC; HBRUSH hBrush; HPEN hPen; PAINTSTRUCT PtStr; ////////////////////////////

double x1(doublea,double b, int *s);

double mean=0,sigma=1.0;

double x[10000],b[10000]={0};

inti,j;

int s1;

int k;

s1=19444;

for(j=0;j

{

x[j]=0;

for(i=0;i

{

x[j]=x[j]+x1(mean,sigma,&s1); x[j]=x[j]-6.0; for(i=0;ix[i]) b[j]=b[j]+1; } }

}

SelectObject(hDC,hBrush); SelectObject(hDC,hPen); /////////////////////// } //////////////////////////////////////////// for(k=0;k

BOOL InitWindows(HINSTANCE hInstance,intnCmdShow) {

} HWND hWnd; hWnd=CreateWindow("WinFill", "高?斯1分¤?布?", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); return FALSE; if(!hWnd) ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); return TRUE;

BOOL InitWindowsClass(HINSTANCE hInstance) {

}

double x1(doublea,double b, int *s) { double t;

*s=2045*(*s)+1;

*s=*s-(*s/1048576)*1048576;

t=(*s)/1048576.0;

return(t);

} WNDCLASS WndClass; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,"END"); WndClass.hInstance=hInstance; WndClass.lpfnWndProc=WndProc; WndClass.lpszClassName="WinFill"; WndClass.lpszMenuName=NULL; WndClass.style=CS_HREDRAW|CS_VREDRAW; returnRegisterClass(&WndClass);


相关文章

  • 序贯高斯模拟方法在尼日利亚KK油田中的应用(论文)
  • 计算机时代2012年第5期 ・ 13 ・ 序贯高斯模拟方法在尼日利亚KKfI扫田中的应用★ 王勇标1,杨鹏2,李君1,王伟1,包兴1,李辉1,李强1 (1.长江大学地球科学学院,湖北荆州434023: 2.中国石油集团川庆钻探工程有限公司长 ...查看


  • 北京理工大学随机信号分析实验报告
  • 本科实验报告 实验名称: 随机信号分析实验 实验一 随机序列的产生及数字特征估计 一.实验目的 1.学习和掌握随机数的产生方法. 2.实现随机序列的数字特征估计. 二.实验原理 1.随机数的产生 随机数指的是各种不同分布随机变量的抽样序列( ...查看


  • 通原简答题
  • 第三章 1. 何谓随机过程?它具有什么特点? 答:随机过程是所有样本函数的集合,是在时间进程中处于不同时刻的随机变量的集合. 特点:1.不能用确切的时间函数描述 2.具有随机性,每个样本函数都是一个确定的数值,但是都不可预知 2.随机过程的 ...查看


  • 粒子滤波算法综述
  • 第20卷第4期 Vol.20No.4 控 制 与 决 策 Controland Decision 2005年4月 Apr.2005 文章编号:1001-0920(2005)04-0361-05 粒子滤波算法综述 胡士强,敬忠良 1,2 1 ...查看


  • 蒙特卡罗模拟
  • 第八章 Monte Carlo 法 §8.1 概述 Monte Carlo 法不同于前面几章所介绍的确定性数值方法,它是用来解决数学和物理问题的非确定性的(概率统计的或随机的)数值方法.Monte Carlo 方法(MCM ),也称为统计试 ...查看


  • 用于不确定性分析的高斯过程响应面模型
  • 第20卷第1期 2011年3月 计算机辅助工程 ComputerAidedEngineering V01.20No.1Mar.2011 文章编号:1006-0871(2011)01.0101.05 用于不确定性分析的高斯过程响应面模型 设计 ...查看


  • 非线性滤波概念和原理介绍(legend08fda整理)
  • 非线性滤波概念和原理介绍 一.背景介绍[1] "估计"就是从带有随机误差的观测数据中估计出某些参数或某些状态变量.估计问题一般分为三类:从当前和过去的观测值来估计信号的当前值,称为滤波:从过去的观测值来估计信号的将来值, ...查看


  • 随机信号分析实验报告
  • 随机信号分析实验报告 班级:13050141 姓名: 学号: 日期:2016年5月24日 1 实验一 随机噪声的产生与性能测试 一.实验内容 1.产生满足均匀分布.高斯分布.指数分布.瑞利分布的随机数,长度为N=1024,并计算这些数的均值 ...查看


  • 基于稀疏编码的自然图像特征提取及去噪
  • • 1782 • 系 统 仿 真 学 报 V ol. 17 No. 7 JOURNAL OF SYSTEM SIMULATION July 2005 基于稀疏编码的自然图像特征提取及去噪 尚 丽1,2,郑春厚1,2 (1 中国科学院合肥分院 ...查看


热门内容