如何从受单独概率分布的另一个随机值约束的分布中生成随机值?

时间:2019-05-02 18:15:16

标签: matlab random probability standard-deviation probability-distribution

我有两个概率分布,一个beta分布和一个对数正态分布。我想做的是从我的beta分布内绘制一个随机值,并基于该值在标准偏差范围内的位置,然后我也想从我的对数正态分布中绘制一个也在该标准偏差范围内的随机值范围。

例如:我从我的beta分布中得出0.2,该值大于一个标准偏差,但小于两个均值大于平均值。然后,我想从对数正态分布中生成一个随机值,该随机值被限制在我的第一标准偏差和第二标准偏差的范围之间(假设范围在100到1000之间)。

标准偏差范围如下:在一个标准偏差内,大于一个标准偏差但在平均值之上小于两个标准偏差,在平均值之上大于两个标准偏差,小于一个标准偏差但大于两个标准均值以下的偏差,以及均值以下的两个标准偏差。

我在MATLAB中尝试使用的代码:

1)对于每次迭代,生成一个随机的beta分布值和一个随机的对数正态分布值。 2)如果beta值在指定的标准偏差范围内,并且对数正态值也在指定的标准偏差范围内,则结束循环并将值打印在数组中

我遇到的问题是,随机生成的beta值生成得非常好,但是对于每个对数正态值,我剩下的值是代码经过了哪一次迭代。

数组如下:

0.1    1
0.12   2
0.05   3
0.07   4
.......

这是我的代码:

close all;
clc;


d= xlsread('Poro perm data for Clarke Lake.xlsx');                                                                               
pdPor = d(:,2);
pdPerm = d(:,8);
porosity_permeability = []; % openspace for array
temp=[];
Perm = [1:300,1];
for i=1:300
    porRandom = betarnd(3.1800,44.87,[1 1]);
    mu=1.0130;
    sigma = 2.574;

    permRandom =lognrnd(mu,sigma);

    if porRandom <=(mean(pdPor) + std(pdPor)) && porRandom >= (mean(pdPor) - std(pdPor))                           

        if permRandom <=(mean(pdPerm) + std(pdPerm)) && permRandom >= (mean(pdPer) - std(pdPer)) 
            Perm(i) = permRandom; 
        end
    elseif porRandom < (mean(pdPor) - (std(pdPor))) && porRandom > (mean(pdPor) - ((std(pdPor))*2))                 

           if permRandom < (mean(pdPerm) - (std(pdPerm))) && permRandom > (mean(pdPerm) - ((std(pdPerm))*2)) 

              Perm(i) = permRandom; 
           end
    elseif porRandom < (mean(pdPor) - (((std(pdPor))*2)))                                              


           if permRandom < (mean(pdPerm) - (((std(pdPerm))*2)))  
              Perm(i) = PermRandom;
           end
    elseif porRandom > (mean(pdPor) + (std(pdPor))) && porRandom < (mean(pdPor) + ((std(pdPor))*2))         

            if permRandom > (mean(pdPerm) + (std(pdPerm))) && permRandom < (mean(pdPerm) + ((std(pdPerm))*2))
                Perm(i) = permRandom;
            end
    else porRandom > ((mean(pdPor)) + (((std(pdPor))*2)))                                        

            if permRandom > ((mean(pdPerm)) + (((std(pdPerm))*2)))   
                Perm(i) = permRandom;
            end
    end

    temp=[porRandom, Perm(i)]; % temporary space
    porosity_permeability=[porosity_permeability;temp]; 

end

感谢您调查我的问题!如果我的解释和用语不够明确,我深表歉意。我只是在学习编码和MATLAB。

1 个答案:

答案 0 :(得分:0)

在for循环之前,您定义了Perm = [1:300,1];,所以当所有if条件都缺失时,您将获得原始值,即迭代的索引。可能是因为您不能确保两个随机数都放在同一框中,对吗?

如果您希望在permRandom达到porRandom的相同间隔之前重新生成,则应在for循环中使用另一个循环,如下所示:

...
porRandom=***;
while true
  permRandom=***
  if ****
    Perm(i) = permRandom;
    break
  end
end
***your print the good result

因此,只有将两者放在同一框中,它才会中断循环并继续打印。


与您的问题无关的事情:if-end内部的每个操作都相同。可以合并为一个。