资源描述
一、产生0-1均匀分布数
采用混合同余法,,,即为一个在0~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;根据中心极限定理有,根据此式可以由12个0~1分布数产生一个高斯数。改变循环次数可以得到任意多个标准高斯分布数。
程序实现代码如下:
int main()
{
double mean,sigma;
double x[100];
int i,j;
int s;
mean=0.0;
sigma=1.0;
s=19444;
cout<<"产生个高斯数:"<<endl;
for(j=0;j<200;j++)
{
x[j]=0;
for(i=0;i<12;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<<endl;}
}
cout<<endl;
产生一百个高斯数:
三、由得到的高斯分布数绘制概率密度函数
采用API图形处理中的Rectangle矩阵绘制函数绘制图形,将得到的高斯数分成一个个小区间,计算每个区间内的高斯数的个数,用这些个数作为矩阵的高。
程序代码如下:
#define NN 1000
#define PI 3.14159826
#include<math.h>
#include<stdio.h>
//#include<conio.h>
#include<time.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <math.h>
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG Message;
if(!InitWindowsClass(hInstance))
return FALSE;
if(!InitWindows(hInstance,nCmdShow))
return FALSE;
while (GetMessage(&Message,0,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
HDC hDC;
HBRUSH hBrush;
HPEN hPen;
PAINTSTRUCT PtStr;
////////////////////////////
double x1(double a,double b, int *s);
double mean=0,sigma=1.0;
srand((unsigned)time(NULL));
double x[10000],b[10000]={0},temp;
int i,j;
int s1;
int k;
s1=19444;
for(j=0;j<10000;j++)
{
x[j]=0;
for(i=0;i<12;i++)
{
x[j]=x[j]+x1(mean,sigma,&s1);
}
x[j]=x[j]-6.0;
}
for(i=0;i<10000;i++)
{ temp=x[i];
// printf("%lf\t",temp);
for(j=0;j<10000;j++)
{
if(-3+0.2*j<temp&&-3+0.2*(j+1)>temp)
b[j]=b[j]+1;
}}
/////////////////////////////////
switch(iMessage){
case WM_PAINT:
hDC=BeginPaint(hWnd,&PtStr);
SetMapMode(hDC,MM_ANISOTROPIC);
hPen=(HPEN)GetStockObject(BLACK_PEN);
hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
SelectObject(hDC,hBrush);
SelectObject(hDC,hPen);
///////////////////////
////////////////////////////////////////////
for(k=0;k<100;k++){
Rectangle(hDC,20+10*k,400-0.3*b[k],30+10*k,400);
}
EndPaint(hWnd,&PtStr);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
}
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd;
hWnd=CreateWindow("WinFill",
"高斯分布",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
if(!hWnd)
return FALSE;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
BOOL InitWindowsClass(HINSTANCE hInstance)
{
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;
return RegisterClass(&WndClass);
}
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);
}
得到结果图如下:
展开阅读全文