擅长:python、mysql、java
<p>实际上,我最后使用了反cdf方法来处理均匀分布在球体上的点</p>
<p>像这样</p>
<pre><code>def random_uniform_ring(center=np.array([0,0]),R=1,r=0,nsamples=1):
"""
generate point uniformly distributed in a ring
"""
nd = len(center)
x = np.random.normal(size = (nsamples,nd))
x /=np.linalg.norm(x,axis=1)[:,np.newaxis] #generate on unit sphere
# using the inverse cdf method
u = np.random.uniform(size=(nsamples))
sc = (u*(R**nd-r**nd)+r**nd)**(1/nd) #this is inverse the cdf of ring volume as a function of radius
return x*sc[:,None]+center
</code></pre>
<p>测试</p>
^{pr2}$
<p><a href="https://i.stack.imgur.com/5mZ6H.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/5mZ6H.png" alt="sampling_uniformly_in_a_ring"/></a></p>
<p>这可能相当于@Mbo的答案,但不幸的是我没有时间去测试。如果有人能验证他的答案,我很乐意接受。在</p>