首页 > 解决方案 > 如何从受来自单独概率分布的另一个随机值约束的分布中生成随机值?

问题描述

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

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

标准差范围如下:在1个标准差以内,大于1个标准差但比平均值高出2个标准差,大于平均值2个标准差,小于1个标准差但比平均值低2个标准差均值,并且低于均值的两个标准差。

我在 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。

标签: matlabrandomprobabilitystandard-deviationprobability-distribution

解决方案


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

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

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

所以只有当你把两个放在同一个盒子里时,它才会打破循环并继续打印。


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


推荐阅读