matlab 如何在指定圆域中生成随机数
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/13 16:49:58
matlab 如何在指定圆域中生成随机数
比如指定圆域为 x^2+y^2<r
如何仅仅在这个区域内生成均匀随机数?要保证足够均匀~
尝试过以下两种方法:1)先生成方形区域随机数再截取:(主干)
ran=rand(1000);
ran2=(ran-0.5)*2*r;
for i=1:1000
for j=1:1000
if r^2>ran2(i)^2+ran2(j)^2
plot(ran2(i),ran2(j),'r')
hold on
end
end
end
2)生成圆域内任意圆上的随机点:
a1=2*pi*rand(1,1000);
r1=r*rand(1,1000);
x=sin(a1).*r1;
y=cos(a1).*r1;
a2=0:2*pi/100:2*pi;
plot(r*sin(a2),r*cos(a2),'-b',x,y,'or')
结果为以下两张图,因为算法本身缺陷,无论1)2)都不够均匀,有高手有更好的方法吗?/>
比如指定圆域为 x^2+y^2<r
如何仅仅在这个区域内生成均匀随机数?要保证足够均匀~
尝试过以下两种方法:1)先生成方形区域随机数再截取:(主干)
ran=rand(1000);
ran2=(ran-0.5)*2*r;
for i=1:1000
for j=1:1000
if r^2>ran2(i)^2+ran2(j)^2
plot(ran2(i),ran2(j),'r')
hold on
end
end
end
2)生成圆域内任意圆上的随机点:
a1=2*pi*rand(1,1000);
r1=r*rand(1,1000);
x=sin(a1).*r1;
y=cos(a1).*r1;
a2=0:2*pi/100:2*pi;
plot(r*sin(a2),r*cos(a2),'-b',x,y,'or')
结果为以下两张图,因为算法本身缺陷,无论1)2)都不够均匀,有高手有更好的方法吗?/>
%算法为:
%1)在指定圆的最小外切正方形内均匀布n个点
%2)删除圆外的m个点
%3)重复1、2步骤,每次重复1时的布置点数n为上一次删除点数m
%因为正方形的面积与圆面积之比为pi/4约为0.75
%循环第二次时删除的点数m就仅为0.0625*需要点数,收敛快.
n=1000;%总点数
r=5;%半径
x=2*r*rand(1,n)-r;%开始构造随机点
y=2*r*rand(1,n)-r;
index=find(x.^2+y.^2>r.^2);
len=length(index);
x(index)=[];
y(index)=[];
while len
xt=2*r*rand(1,len)-r;
yt=2*r*rand(1,len)-r;
index=find(xt.^2+yt.^2>r.^2);
len=length(index);
xt(index)=[];
yt(index)=[];
x=[x xt];
y=[y yt];
end
plot(x,y,'ro')
axis equal
%1)在指定圆的最小外切正方形内均匀布n个点
%2)删除圆外的m个点
%3)重复1、2步骤,每次重复1时的布置点数n为上一次删除点数m
%因为正方形的面积与圆面积之比为pi/4约为0.75
%循环第二次时删除的点数m就仅为0.0625*需要点数,收敛快.
n=1000;%总点数
r=5;%半径
x=2*r*rand(1,n)-r;%开始构造随机点
y=2*r*rand(1,n)-r;
index=find(x.^2+y.^2>r.^2);
len=length(index);
x(index)=[];
y(index)=[];
while len
xt=2*r*rand(1,len)-r;
yt=2*r*rand(1,len)-r;
index=find(xt.^2+yt.^2>r.^2);
len=length(index);
xt(index)=[];
yt(index)=[];
x=[x xt];
y=[y yt];
end
plot(x,y,'ro')
axis equal