所以我必须在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
答案 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之间的随机数并计算其中的弧。