【源码】C语言和matlab泊松随机变量的产生与验证

方法介绍

这是我自己写报告时写的,不一定讲得很清楚,更多细节可以阅读相关的文章。这是产生泊松变量的方法,但是至于为什么不做探讨,工程上会用就行,感兴趣的可以自己去了解。
【源码】C语言和matlab泊松随机变量的产生与验证_第1张图片
【源码】C语言和matlab泊松随机变量的产生与验证_第2张图片

关键c代码

#define N  10000//产生变量的个数
int main() {
     
    int i = 0;//迭代产生泊松变量中间变量初始化
    double b = 1;//迭代产生泊松变量中间变量初始化
    double lamda = 10;//泊松分布参数,可修改
    double a = exp(-lamda);
    int j, flag;//操作变量
    double r[N];//均匀随机数数组
    int p[N];//泊松分布变量数组
    for (j = 0; j < N; j++) {
     
        flag = 0;
        r[i]= rand() / (RAND_MAX + 1.0);//产生(0,1)均匀分布的随机数
        b = b * r[i];//随机数连乘用以判断是否符合泊松分布
        if (b < a) {
     
            p[j] = i;//满足输出泊松随机数
            b = 1; i = 0;//重新初始化
            flag = 0;//标志清零
        }
        else {
     
            i = i + 1;//不满足循环产生(0,1)均匀随机数
            flag = 1;//标志置1
        }
        while (flag) {
     //标志为1重复上述过程,直到产生满足条件的泊松随机数
            r[i] = rand() / (RAND_MAX + 1.0);
            b = b * r[i];
            if (b < a) {
     
                p[j] = i;
                b = 1; i = 0;
                flag = 0;
            }
            else {
     
                i = i + 1;
                flag = 1;
            }
        }
    }
}

关键matlab代码

%% 产生服从泊松分布的变量,并画出频率分布图与pmf对比
clc;clear;
lamda=10;a=exp(-lamda); %泊松参数,可修改
b=1; i=0;%迭代产生泊松变量中间变量初始化
N=1000000;%产生的服从泊松分布的泊松变量值个数,可修改N越大,越逼近pmf,但计算量越大
for j=1:1:N
    flag=0;
     r(i+1)=rand();%产生服从(0,1)均匀分布的随机数
        b=b*r(i+1);%b=u1*u2*...*um..,u是服从标准均匀分布的随机变量
        if(b<a)
            p(j)=i;%满足乘积小于a返回下标i即为服从泊松分布的变量
             b=1; i=0;%重新初始化,进行循环产生
             flag=0;%清零标志
        else
            i=i+1;%不满足则继续产生u
            flag=1;%进行循环标志,直到找到满足条件的i
        end
    while(flag)%进行循环
        r(i+1)=rand();%产生服从均匀分布的随机数
        b=b*r(i+1);%b=u1*u2*...*um..,u是服从标准均匀分布的随机变量
        if(b<a)
            p(j)=i;%满足乘积小于a返回下标i即为服从泊松分布的变量
             b=1; i=0;%重新初始化,进行循环产生
             flag=0;%清零标志
        else
            i=i+1;%不满足则继续产生u
            flag=1;%进行循环标志,直到找到满足条件的i
        end
    end
end
%% 画标准的泊松分布pmf函数图像 即f(x)=exp(-lamda)*lamda^x/factorial(x),x=0,1,2,3...
x=0:1:50;
pdf1=a.*lamda.^x./ factorial(x);
%% 统计变量出现的频率
for j=0:1:N-1
m(j+1)=sum(p(:)==j)./N;%统计变量出现的个数
end
%% 画标准pmf函数与频率分布图对比看是否满足泊松分布
stem(x,pdf1,'r','linewidth',2);
hold on;
stem((0:1:50),m(1:51),'black','linewidth',3);%画火柴杆图
hold on   
legend('参数为10的泊松分布概率质量函数','产生的随机变量归一化频率分布图');
xlabel('x');
ylabel('PMF: f(x)');

结果验证

泊松参数为10时的结果对比,产生的随机数数量为100000时的结果,可以看出随机数的频率分布和PMF基本一致,所以得到的随机数是服从泊松分布的。
【源码】C语言和matlab泊松随机变量的产生与验证_第3张图片

说明:如果是SWJTUers的话,千万别完全照抄代码(好歹自己改一下换一换思路啥的,有啥问题可以问我),这是老师的课程设计,被逮到照抄代码的话,凉凉!

码字不易,转载请注明出处!

你可能感兴趣的:(笔记,算法,matlab,c语言,程序人生)