一些学习成果的分享。

用MATLAB/C程序产生高斯分布的随机变量

19-20第一学期《随机信号分析》课程设计
一、题目:
  产生一个均值为0,方差为1的高斯分布的随机变量并检验。
验证方式:
  在产生高斯分布随机数后,1、画出其概率密度图像,观察图像是否符合高斯分布的特征。2、求产生随机数的数学期望和方差,和m、σ^2进行比较。3、利用matlab中Lilliefors函数检测产生的随机数是否服从高斯分布。
  Lilliefors函数:[h,p]=lillietest(Y) (返回值h为假设,只有0和1两种情况,h=0假设符合正态分布,h=1假设不符合正态分布。返回值p为事情的发生概率,p<0.05,为不可能事件,拒绝;p>0.05,接受)

二、MATLAB代码

function Y = GaussRandomNumbers

%产生服从高斯分布的随机变量Y

%最终产生n-1个数
n=10000;

%输入方差和数学期望

var1=input('请输入高斯分布的方差var=:');
m=input('请输入高斯分布的数学期望m=:');

%产生第一个均匀分布随机数X1
x1=zeros(1,n);
x1(1)=224;
X1=zeros(1,n-1);
for i=2:n
    x1(i)=mod(2045*x1(i-1)+1,2^20);
    X1(i-1)=x1(i)/2^20;
end

%产生第二个均匀分布随机数X2
x2=zeros(1,n);
x2(1)=156;
X2=zeros(1,n-1);
for j=2:n
    x2(j)=mod(2045*x2(j-1)+1,2^20);
    X2(j-1)=x2(j)/2^20;
end

%产生高斯分布的随机数Y
for u=2:n
    Y1(u-1)=sqrt(-2*log(X1(u-1)));
    Y2(u-1)=cos(2*pi*X2(u-1));
    Y(u-1)=sqrt(var1)*Y1(u-1)*Y2(u-1)+m;
end

%画出Y的时域特性曲线(观察Y的分布)
figure(2)
plot(Y)
title('时域特性曲线');xlable('时间(t)');xlable('幅度')

%画出Y概率密度图像:
figure(1)
[a,b]=ksdensity(Y);
plot(b,a);
title('随机变量Y概率密度图像');xlabel('y');ylabel('f(y)');

%检验:

%1、检验生成的随机数方差和数学期望是否与输入一致
V=var(Y)
M=mean(Y(:))

%2、用matlab的Lilliefors检验Y是否服从正态分布
%返回值h为假设,只有0和1两种情况,h=0假设符合正态分布,h=1假设不符合正态分布
%返回值p为事情的发生概率,p<0.05为不可能事件,拒绝;p>0.05,接受

[h,p]=lillietest(Y)

三、C语言代码

#include <stdio.h>
#include <math.h>  

int main()

{
    int N=999;  
    float x1a[N];float num[N];float a[N];float b[N];float x1[N];float x2a[N];float x2[N];
    int n;
    float mean;float var;
    scanf("%d %f %f",&n,&mean,&var);
    //设置要产生的随机数的数量n、均值mean、方差var
    int i=2;
    
    int pi=3.14159;
    float M=pow(2.0,20.0);
    x1a[1]=224;
    x2a[1]=156;
    for (i=2;i<=n;i++)
    {
        x1a[i]=(float)((int)(2045.0*x2a[i-1]+1.0)%(int)M);
        x1[i-1]=x1a[i]/M;//产生均匀分布的X1 
        x2a[i]=(float)((int)(2045.0*x2a[i-1]+1.0)%(int)M);
        x2[i-1]=x2a[i]/M;//产生均匀分布的X2 
        
        a[i-1]=sqrt(-2.0*log(x1[i-1]));
        b[i-1]=2*pi*x2[i-1];
        num[i-1]=var*a[i-1]*cos(b[i-1])+mean;
        //利用X1,X2产生高斯分布num 
         
        printf("%f",num[i-1]);
        printf("\n");
    }
        system("pause");
return 0;

添加新评论