内外半径球形 Shell 内点的随机均匀 3D 分布
Random Uniform 3D Distribution of Points Inside a Spherical Shell of Inner and Outer Radius
我正在尝试(尽可能高效地)生成一个随机均匀的 3D 点分布在内半径 r_min
和外半径 r_max
的球体内,即一个shell。我在这里找到了类似的解决方案:Sampling uniformly distributed random points inside a spherical volume,但这仅适用于 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()
.如何在指定内半径和外半径的同时在此球体 shell 上正确生成均匀的随机点?
Sampling uniformly distributed random points inside a spherical volume 的强力改编将在 [-r_max, r_max]
上生成三个统一变量 x, y, z
,并且仅在 r_min <= (x**2 + y**2 + z**2)**0.5 <= r_max
时保留
从 https://math.stackexchange.com/questions/1885630/random-multivariate-in-hyperannulus,可以从 n 维超环面几何中的均匀分布随机采样半径,在 n=3维,是一个球体shell,内径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
时产生预期分布。
我正在尝试(尽可能高效地)生成一个随机均匀的 3D 点分布在内半径 r_min
和外半径 r_max
的球体内,即一个shell。我在这里找到了类似的解决方案:Sampling uniformly distributed random points inside a spherical volume,但这仅适用于 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()
.如何在指定内半径和外半径的同时在此球体 shell 上正确生成均匀的随机点?
Sampling uniformly distributed random points inside a spherical volume 的强力改编将在 [-r_max, r_max]
上生成三个统一变量 x, y, z
,并且仅在 r_min <= (x**2 + y**2 + z**2)**0.5 <= r_max
从 https://math.stackexchange.com/questions/1885630/random-multivariate-in-hyperannulus,可以从 n 维超环面几何中的均匀分布随机采样半径,在 n=3维,是一个球体shell,内径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
时产生预期分布。