C语言生成符合柯西、指数分布(连续型)的随机数(手写)

求满足连续性概率分布的随机数生成

(C语言生成符合泊松分布(离散型)的随机数(手写))https://blog.csdn.net/Zhang_713/article/details/109130118

对于连续型概率分布,只需要通过反函数即可得出随机数。原理如下:

下图为利用反函数求随机数并根据随机数的频率得到分布图的过程。

  而下面这个图的原函数是x3次方,反函数为x1/3次方,我们用rand生成一些随机数并代入x1/3次方得到的值yi就是图上的蓝线,根据在y轴上设置好的区间来看,0-10的y数量相对比80-100的y数量明显少了太多,而0-10的y的数量就映射到le图中x轴绿色位置的对应的红线上的点,这些点就满足x3分布。类似的连续性概率分布原理都是如此。

(补充)

c语言代码如下:

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

int main()
{
    double a;
    srand((unsigned)time(NULL));

    double z;
    double zhishu(double a1);//指数
    double Cauchy_03(double a1);//柯西
    double Zipf_28(double a1);//zf

    int aa[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//存区间频率
    for(int i=0;i<100000;i++){
        a = rand()%100000;
        if(a/10!=0){
            //z=-1/log(1-a/10);
            z=Cauchy_03(a/100000);
            if(z!=0){
                if(z<=1){aa[0]++;}//中间的1-8我是用作测试的,这里就删掉了
                else if(z<2){aa[9]++;}
                else if(z<3){aa[10]++;}
                else if(z<4){aa[11]++;}
                else if(z<5){aa[12]++;}
                else if(z<6){aa[13]++;}
                else if(z<7){aa[14]++;}
                else if(z<8){aa[15]++;}
                else if(z<9){aa[16]++;}

                else {aa[17]++;}


        }

    }
    }
    for(int i=0;i<20;i++){
        printf("%d\n",aa[i]);
    }

    return 0;
}

double zhishu(double a1){
    double z;
    z=-1/log(1-a1);
    return z;
}


double Cauchy_03(double a1){
    double z,z1;
    z1=1/(3.14159*a1)-1;
    return z1;
}

double Zipf_28(double a1){

    return 0.1/a1;

}

 

### 回答1: 可以使用Matlab内置的`random`函数来生成Cauchy柯西分布的随机数。以下是一个示例代码: ```matlab % 设定参数 gamma = 1; % 尺度参数 x0 = 0; % 位置参数 % 生成随机数 r = random('t', x0, gamma, 1, 1000); % 绘制直方图 histogram(r, 'Normalization', 'pdf'); xlabel('x'); ylabel('pdf'); title('Cauchy Distribution'); ``` 其中,`random('t', x0, gamma, 1, 1000)`表示生成1000个符合Cauchy柯西分布的随机数,其中`'t'`表示生成的分布为学生t分布,`x0`为位置参数,`gamma`为尺度参数。在绘制直方图时,使用`'Normalization', 'pdf'`选项将直方图转化为概率密度函数图像。 ### 回答2: 柯西分布是一个连续概率分布,通常用于描述具有长尾分布的数据。柯西分布的概率密度函数为: f(x; x0, γ) = (1/πγ) * (γ^2 / (γ^2 + (x-x0)^2)) 其中x0是分布的位置参数,γ是分布的尺度参数。 要在MATLAB中生成柯西分布的随机数,可以使用randn函数来生成标准正态分布的随机数,然后根据柯西分布的属性进行变换。 代码如下所示: % 设置柯西分布的参数 x0 = 0; % 位置参数 gamma = 1; % 尺度参数 % 生成随机数 n = 1000; % 设置生成随机数的个数 z = randn(n, 1); % 生成n个标准正态分布的随机数 % 根据柯西分布的属性进行变换 x = x0 + gamma * tan(pi * (z - 0.5)); 通过以上代码,可以生成符合柯西分布的随机数序列x,其中x0是分布的位置参数,gamma是分布的尺度参数,n是生成随机数的个数。可以根据需要修改参数来生成不同的柯西分布随机数序列。 ### 回答3: 柯西分布是一个无界的分布,其概率分布函数为: f(x; x0, γ) = (1/πγ) * [γ^2/((x-x0)^2 + γ^2)] 其中x0是柯西分布的位置参数,γ是尺度参数。他们定义了分布的位置和形状。 在Matlab中,可以使用rand函数生成均匀分布的随机数,然后将其转化为柯西分布的随机数。具体代码如下: x0 = 0; % 柯西分布的位置参数 gamma = 1; % 柯西分布的尺度参数 N = 1000; % 需要生成随机数个数 u = rand(N, 1); % 生成N个均匀分布的随机数 x = x0 + gamma * tan(pi * (u - 0.5)); % 转化为柯西分布的随机数 以上代码会生成N个服从柯西分布的随机数,存储在变量x中。 需要注意的是,柯西分布由于其尾重(无界)的特性,其随机数生成有时会导致计算上的困难,尤其是在尺度参数较大的情况下。因此,在柯西分布的随机数生成时,需要注意应用场景和参数选取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值