回 帖 发 新 帖 刷新版面

主题:求助,球内均匀分布点

已知n个(0,1)内的随机数,要在半径r内对球均匀撒点,请问算法如何实现?

回复列表 (共16个回复)

沙发

在0-1中生产2个随机数(a1,b1),点的坐标可写成(a1*cos(360*b1),a1*sin(360*b1))
重复以上步骤即可!

板凳

[quote]在0-1中生产2个随机数(a1,b1),点的坐标可写成(a1*cos(360*b1),a1*sin(360*b1))
重复以上步骤即可![/quote]
1,您这个是圆,楼主要求是球
2,您这个有中心聚度,不是均匀,均匀的应该是根号下(a1)*sin(2*pi*b1),根号下(b1)*cos(2*pi*b1)

3 楼

笨人想出的没有技术含量的算法:可以直接产生x,y,z三个随机数,再将x^2+y^2+z^2>1的扔掉,直到球内有n个随机点为止。

另,2楼说的没错,1楼的算法感觉是[0,1)上的随机数绕着圆心转一圈,半径小的地方点出现的几率与大半径处一样,就会产生中心聚度。
二楼的方法相当于产生了在[0,1)区间上按分布律f(x)=2x分布的随机数,再将这些数绕圆心转一圈。

那么,球内均匀分布是不是先产生按f(x)=3x^2分布的随机数,即半径开立方,然后
x=开立方a1 * sin(2*pi*b1)*cos(2*pi*c1)
y=开立方a1 * sin(2*pi*b1)*sin(2*pi*c1)
z=开立方a1 * cos(2*pi*b1)                     ?


beginner,望赐教!

4 楼

大家都用到了sin等函数,须知,这些好像不是均匀函数的,
一盒0~1分布的均匀随机函数,经过sin函数的变换,不再是
均匀分布的,所以,不成的。
要想别的办法,不难的

5 楼

这个问题的关键是,什么是“均匀”?

lz能给出“均匀”的准确定义,这个问题就很容易了

6 楼

所谓均匀应该是单位体积内的点数是一样的

lz和二楼是亲兄弟啊~

7 楼

哈哈,你不说还没发现

另外,均匀,单位体积内的点数不是“一样”,而是“大概一样”。

8 楼


9 楼

[quote]笨人想出的没有技术含量的算法:可以直接产生x,y,z三个随机数,再将x^2+y^2+z^2>1的扔掉,直到球内有n个随机点为止。

另,2楼说的没错,1楼的算法感觉是[0,1)上的随机数绕着圆心转一圈,半径小的地方点出现的几率与大半径处一样,就会产生中心聚度。
二楼的方法相当于产生了在[0,1)区间上按分布律f(x)=2x分布的随机数,再将这些数绕圆心转一圈。

那么,球内均匀分布是不是先产生按f(x)=3x^2分布的随机数,即半径开立方,然后
x=开立方a1 * sin(2*pi*b1)*cos(2*pi*c1)
y=开立方a1 * sin(2*pi*b1)*sin(2*pi*c1)
z=开立方a1 * cos(2*pi*b1)                     ?


beginner,望赐教![/quote]
经验证,第二种方法貌似有问题,产生出来的随机数会向z轴的两端聚集,
x=开立方a1 * sin(2*pi*b1)*cos(2*pi*c1)
y=开立方a1 * sin(2*pi*b1)*sin(2*pi*c1)
z=开立方a1 * cos(2*pi*b1)


第一种方法(产生(x,y,z),然后2.0*(x,y,z)-1.0,再然后将x^2+y^2+z^2>1的舍去)尽管很笨,但还算有效。但无论如何,球心肯定是不会有点的。

10 楼

回ls: 球心有没有点都无所谓,照ls说法,任意给定一个位置都不会有点的。既然是随机数,您怎么知道不会产生3个0呢?

我来回复

您尚未登录,请登录后再回复。点此登录或注册