随机数生成 - 代码无效

时间:2015-08-03 06:13:31

标签: matlab random

所以我必须在0到90之间生成一个随机数(在这里称为'p'),其频率分布是余弦函数(即我应该在0到45之间的数字多于45到90之间的数字)。

我正在使用matlab 代码如下 -

flag = 1; 
while flag == 1 
    candidate = randi([0,90]);
    if rand < cosd( candidate )
        p = candidate;
        flag = 2;
    end
end  

我正在生成20个这样的数字,但我总是将大部分数字推向更高端(45-90)。 从这20个数字中,几乎没有1-2个数字<1。 45。

我的代码错了吗?

编辑:好的,我得到了答案。我尝试单独运行代码,如下所示 -

for i = 1:20
  flag = 1; 
  while flag == 1 
      candidate = randi([0,90]);
      if rand < cosd( candidate )
          p = candidate;
          flag = 2;
          disp(p);
      end
  end  
end

我得到p的大部分值在0到45之间。我的原始代码有一个外部'if'条件,这是仅接受更高'p'值的原因。我使用了一个while循环,迭代次数远远超过20,得到20个'p'值。

这是我的原始代码段 -

while zz <=20 
        d = randi([0,359]);
        flag = 1;

        while flag == 1 
            c = randi([0,90]);
            x = rand(1);
            if x < cosd(c)
                p = c;
                flag = 2;
            end
        end



        if 'external condition' 
              strike(zz) = d;
              dip(zz) = p;
              slip(zz) = round(i);
              zz= zz+1;
        end

end

1 个答案:

答案 0 :(得分:1)

如果您只想获得答案,请阅读最后一行。但如果你想知道为什么答案是正确的,请阅读解释。

假设你有一个像这样的独特分配函数:

f(0)=1;
f(1.5)=10;
f(4)=9;

所以累积函数是:

F(0)=1;
F(1.5)=11;
F(4)=20;

不,我们想要一个相对累积函数,因为F(4)=20(4是最后一项),我们将累积函数除以20.所以它将是:

F'(0)=0.05
F'(1.5)=0.55
F'(4)=1.00

现在,我们生成一个介于0和1之间的随机数。每当我们生成一个随机数时,我们会为F'(x)生成一个值,如果F'(x)在任何地方都没有该值,我们会使用最近的值更大的数字(如y)对于某些x,F(x)=y。对于我的例子,基于相对累积函数:

  • 如果随机数小于0.05,我们的基于分布的随机数为1.5

  • 如果随机数介于0.05和0.55之间,我们的基于分布的随机数为2,

  • 如果大于0.55,我们的基于分布的随机数为4

我们应该使用连续分布函数进行类似的工作。不同的是,在连续世界中,我们使用积分而不是累积函数。所以对于你的问题,我们有:

f(x)=cos(x) , 0<=x<=90
F(x)=sin(x)-sin(0)=sin(x) , 0<=x<=90
F'(x)=cos(x) , 0<=x<=90   (Because F(90)=1)

现在我们生成一个介于0和1之间的随机数(如r)。所以我们有:

F'(x)=r => sin(x)=r => x=arcsin(r)

实际上,你只需要生成一个介于0和1之间的随机数并计算其中的弧。