[已答复] 产生满足0<x+y<1的随机点(x,y)

[复制链接]
画船听雨1 发表于 2018-4-21 10:19:27
前辈们,麻烦大家看一下,产生满足0<x+y<1的随机点(x,y),条件如下:
0<x<1
0<y<1
0<x+y<1
想获得这样的点(x,y),晓得用rand产生随机数组,但是怎么让他满足0<x+y<1呢


刘承尚 发表于 2018-4-21 11:10:18
提供一个思路:先随机产生一个随即点x,再产生一个随即点y,求x+y是否满足条件,若是,放入矩阵,若不满足,则重新产生。
这里使用的随机函数是rand函数 。具体代码如下:
  1. clc
  2. clear
  3. close all
  4. tic

  5. Num = 100;i = 1;XY=[];
  6. while i < Num
  7.     xy = rand(1,2);
  8.     if sum(xy)<1;
  9.         XY = [XY;xy];
  10.     end
  11.     i = length(XY);
  12. end
  13. plot(XY(:,1),XY(:,2),'ko')

  14. toc
复制代码
随机产生100组数据结果:

plot

plot




maple1314168 发表于 2018-4-21 11:13:21
就是正方形的一半,等腰直角三角形。
先生成,再筛选符合的。大概一半的机会。

画船听雨1 发表于 2018-4-21 13:06:34
刘承尚 发表于 2018-4-21 11:10
提供一个思路:先随机产生一个随即点x,再产生一个随即点y,求x+y是否满足条件,若是,放入矩阵,若不满足 ...

你好,我后面想了一下,采用了这种方法,代码如下,但是有个问题,这个里边有一半的数字会不符合要求啊,就一直for循环,然后把不满足的继续用新的值产生吗?前辈,然后画出来的图是这样的,很恐怖
空白.png
  1. clc,clear;
  2. p1=rand(100,100);p2=rand(100,100);
  3. p1( (p1+p2)>1 )=0.2;
  4. p2( (p1+p2)>1 )=0.6;
  5. % p1_ini=0:.01:1;p2_ini=0:.01:1;
  6. % [p1,p2]=meshgrid(p1_ini);
  7. value=-(log((p2 - 5.*p1 + (6.*p2 -...
  8. 5).*((21560115664298739.*2.^(1./2).*pi.^(1./2).*erf((2.^(1./2).*5.^(1./2).*p2.^(1./2).*((92.*5.^(1./2).*(1./p2).^(1./2))./125+ 1))./2))./360287970189639680 - (21560115664298739.*2.^(1./2).*pi.^(1./2))./360287970189639680 +...
  9. 1).*((50306936550030391.*2.^(1./2).*pi.^(1./2).*erf((23.*2.^(1./2).*p2.^(1./2).*(1./p2).^(1./2))./25))./360287970189639680- (50306936550030391.*2.^(1./2).*pi.^(1./2))./360287970189639680 + 1))./(p1 + p2 - 1) + 1).*(p1 + p2 -...
  10. 1).*((50306936550030391.*2.^(1./2).*pi.^(1./2).*erf((2.^(1./2).*5.^(1./2).*p2.^(1./2).*((92.*5.^(1./2).*(1./p2).^(1./2))./125+ 1))./2))./360287970189639680 - (50306936550030391.*2.^(1./2).*pi.^(1./2))./360287970189639680 + 7./10))./log(2);
  11. value(isnan(value))=0;
  12. %surf(p1_ini,p2_ini,abs(value))
  13. surf(p1,p2,abs(value))
复制代码

画船听雨1 发表于 2018-4-21 13:08:15
maple1314168 发表于 2018-4-21 11:13
就是正方形的一半,等腰直角三角形。
先生成,再筛选符合的。大概一半的机会。 ...

前辈,我的代码如下,基本上就是你讲的那种方法,然后接下来不满足的一半数字就一直进行用满足条件的新的随机数进行替代吗
  1. clc,clear;
  2. p1=rand(100,100);p2=rand(100,100);
  3. p1( (p1+p2)>1 )=0.2;
  4. p2( (p1+p2)>1 )=0.6;
复制代码

画船听雨1 发表于 2018-4-21 13:11:12
画船听雨1 发表于 2018-4-21 13:08
前辈,我的代码如下,基本上就是你讲的那种方法,然后接下来不满足的一半数字就一直进行用满足条件的新的 ...

就下一次p1和p2里边不满足的用新的随机值来代替

刘承尚 发表于 2018-4-21 13:23:11
代码画图运用了plot3函数:
  1. clc
  2. clear
  3. close all
  4. tic

  5. p1=rand(100,100);p2=rand(100,100);
  6. p1( (p1+p2)>1 )=0.2;
  7. p2( (p1+p2)>1 )=0.6;
  8. % p1_ini=0:.01:1;p2_ini=0:.01:1;
  9. % [p1,p2]=meshgrid(p1_ini);
  10. value=-(log((p2 - 5.*p1 + (6.*p2 -...
  11. 5).*((21560115664298739.*2.^(1./2).*pi.^(1./2).*erf((2.^(1./2).*5.^(1./2).*p2.^(1./2).*((92.*5.^(1./2).*(1./p2).^(1./2))./125+ 1))./2))./360287970189639680 - (21560115664298739.*2.^(1./2).*pi.^(1./2))./360287970189639680 +...
  12. 1).*((50306936550030391.*2.^(1./2).*pi.^(1./2).*erf((23.*2.^(1./2).*p2.^(1./2).*(1./p2).^(1./2))./25))./360287970189639680- (50306936550030391.*2.^(1./2).*pi.^(1./2))./360287970189639680 + 1))./(p1 + p2 - 1) + 1).*(p1 + p2 -...
  13. 1).*((50306936550030391.*2.^(1./2).*pi.^(1./2).*erf((2.^(1./2).*5.^(1./2).*p2.^(1./2).*((92.*5.^(1./2).*(1./p2).^(1./2))./125+ 1))./2))./360287970189639680 - (50306936550030391.*2.^(1./2).*pi.^(1./2))./360287970189639680 + 7./10))./log(2);
  14. value(isnan(value))=0;
  15. %surf(p1_ini,p2_ini,abs(value))
  16. plot3(p1,p2,abs(value),'k.')

  17. toc
复制代码



换一个角度看,正是在一个三角形里面生生成点:

1

1

图中有一条0.2的横线,是因为设置了p1( (p1+p2)>1 )=0.2;
再换个角度看:

2

2




maple1314168 发表于 2018-4-21 13:26:28
画船听雨1 发表于 2018-4-21 13:11
就下一次p1和p2里边不满足的用新的随机值来代替

不满足的就不要啊!
想多点的话可以100*200多,之后筛选。
选择100*100一万对就可以啊。

画船听雨1 发表于 2018-4-21 13:35:05
刘承尚 发表于 2018-4-21 13:23
代码画图运用了plot3函数:

哇,six,six,但是,前辈,我想把这个图片以一种圆滑的方式画出来,而我刚刚出现那种图,我认为的原因是:我的坐标点都是杂乱的,比如是(9,8),(5,8),(10,4),而不是按照大小来的,比如按横坐标来(5,8),(9,8),(10,4),理想图是图一,图二是我的图
理想图.png 空白.png

画船听雨1 发表于 2018-4-21 13:36:26
刘承尚 发表于 2018-4-21 13:23
代码画图运用了plot3函数:

大致轮廓是对的,可能是取点的原因,前辈,卡了一上午了,求前辈指点迷津,造化我吧,阿门,hhhhhhhhhhhhhhhhhhhhhhhhhh

画船听雨1 发表于 2018-4-21 15:01:50
maple1314168 发表于 2018-4-21 13:26
不满足的就不要啊!
想多点的话可以100*200多,之后筛选。
选择100*100一万对就可以啊。 ...

啊哈!我用一个while解决了,hhhhhhhhhh,我机智吧,前辈,代码如下(让我班门弄虎一下)
  1. clc,clear;
  2. p1=rand(100,100);p2=rand(100,100);
  3. while( any( any( (p1+p2)>=1 ) ) )
  4.   p1( (p1+p2)>=1 )=rand(1,length(find((p1+p2)>=1)==1));
  5.   p2( (p1+p2)>=1 )=rand(1,length(find((p1+p2)>=1)==1));
  6. end
复制代码


但是,还有一个bug,就是图有问题,代码如下
  1. clc,clear;
  2. p1=rand(100,100);p2=rand(100,100);
  3. while( any( any( (p1+p2)>=1 ) ) )
  4.   p1( (p1+p2)>=1 )=rand(1,length(find((p1+p2)>=1)==1));
  5.   p2( (p1+p2)>=1 )=rand(1,length(find((p1+p2)>=1)==1));
  6. end
  7. value=-(log((p2 - 5.*p1 + (6.*p2 -...
  8. 5).*((21560115664298739.*2.^(1./2).*pi.^(1./2).*erf((2.^(1./2).*5.^(1./2).*p2.^(1./2).*((92.*5.^(1./2).*(1./p2).^(1./2))./125+ 1))./2))./360287970189639680 - (21560115664298739.*2.^(1./2).*pi.^(1./2))./360287970189639680 +...
  9. 1).*((50306936550030391.*2.^(1./2).*pi.^(1./2).*erf((23.*2.^(1./2).*p2.^(1./2).*(1./p2).^(1./2))./25))./360287970189639680- (50306936550030391.*2.^(1./2).*pi.^(1./2))./360287970189639680 + 1))./(p1 + p2 - 1) + 1).*(p1 + p2 -...
  10. 1).*((50306936550030391.*2.^(1./2).*pi.^(1./2).*erf((2.^(1./2).*5.^(1./2).*p2.^(1./2).*((92.*5.^(1./2).*(1./p2).^(1./2))./125+ 1))./2))./360287970189639680 - (50306936550030391.*2.^(1./2).*pi.^(1./2))./360287970189639680 + 7./10))./log(2);
  11. value(isnan(value))=0;
  12. plot3(p1,p2,abs(value))
  13. R_max=max(max(abs(value)));
  14. [x,y]=find(abs(value)==R_max);
复制代码


理想图像图一,我出来的图像图二,前辈,指点指点嘻嘻
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表