内外半径球壳内点的随机均匀三维分布

b09cbbtk  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(429)

我试图(尽可能有效地)生成一个内半径球体内部点的随机均匀的三维分布 r_min 和外半径 r_max ,即贝壳。我在这里找到了一个类似的解决方案:在一个球形体积内对均匀分布的随机点进行采样,然而这只适用于整个球体 r_min=0 以及 r_max=1 . 这是使用以下代码完成的:

r     = r_max*np.cbrt(np.random.uniform(low=r_min,high=r_max,size=nsamp))
phi   = np.random.uniform(0,2*np.pi,nsamp)
theta = np.arccos( np.random.uniform(-1,1,nsamp)

什么时候 r_min=0 以及 r_max=1.0 ,生成预期结果(沿x-y的二维投影):

但是,当我改变 r_max 或者 r_min 对于0和1以外的任何对象,我都没有得到预期的结果,这可能是由于使用了 np.cbrt() . 在指定内半径和外半径时,如何正确地在这个球壳上生成均匀的随机点?

mlmc2os5

mlmc2os51#

对球形体积内均匀分布的随机点进行采样的蛮力适应是生成三个均匀变量 x, y, z 每个都结束了 [-r_max, r_max] ,并且只有在 r_min <= (x**2 + y**2 + z**2)**0.5 <= r_max

vu8f3i0k

vu8f3i0k2#

从https://math.stackexchange.com/questions/1885630/random-multivariate-in-hyperannulus在n=3维的超环是一个内半径的球壳的几何结构中,可以从均匀分布中随机抽取半径 r_min 和外部 r_out . 执行此操作的代码是

u     = np.random.uniform(0,1,size=nsamp) # uniform random vector of size nsamp
r     = np.cbrt((u*r_max**3)+((1-u)*r_min**3))
phi   = np.random.uniform(0,2*np.pi,nsamp)
theta = np.arccos( np.random.uniform(-1,1,nsamp) )

在指定 r_min 以及 r_out .

相关问题