一、产生0-1均匀分布数
采用混合同余法,xi(axi1c)modM,yixi/M,yi即为一个在
0~1之间的随机数。通常情况下,选取a2045,c1,M220,我们任意给定一个初始值xi1,即可得到一个随机数,在程序中采用指针变量*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;根据中心极限定理有ziyi0.6,根据此式可以由12个0~1分布数产生一个高斯数。改变i112
循环次数可以得到任意多个标准高斯分布数。
程序实现代码如下:
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(axi1c)modM,yixi/M,yi即为一个在
0~1之间的随机数。通常情况下,选取a2045,c1,M220,我们任意给定一个初始值xi1,即可得到一个随机数,在程序中采用指针变量*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;根据中心极限定理有ziyi0.6,根据此式可以由12个0~1分布数产生一个高斯数。改变i112
循环次数可以得到任意多个标准高斯分布数。
程序实现代码如下:
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);