首页 > 代码库 > 如何在半径为1的圆中随机选取一个点

如何在半径为1的圆中随机选取一个点

拿到这个题目大部分人的第一个思路是

  在x轴[-1,1],y轴[-1,1]的正方形内随机选取一点。然后判断此点是否在圆内(通过计算此点到圆心的距离)。如果在圆内,则此点即为所求;如果不在,则重新选取直到找到为止。 正方形的面积为4,圆的面积为pi,所以正方形内的随机点在圆内的概率是pi/4。

  如果对机器学习的算法熟悉的话,这种方法叫做拒绝性采样。就是用一种容易生成的概率分布(本题是正方形的均匀分布),去模拟不容易生成的概率。

\forall x \in \R^2, f(x) \leq a \cdot g(x)

在单位圆上模拟均匀分布,要模拟满足概率分布 f 的随机变量,其中 f 满足 \forall (x,y) \in \R^2, f(x,y) = \frac{1}{\pi} \cdot 1_{Disque}(x,y).    a = \frac{4}{\pi}

我们把 g 选择为均匀分布在一个中心在原点,边长为 2 的正方形上。 

  注意落在圆内的概率是pi/4,(圆的面积是pi,正方形的面积是4),不落在圆的概率是1-pi/4,对于k次试验不落在圆内的概率是(1-pi/4)^k,当k=20时,结果近似于.00000000000004,当k=50时近似10^{-34},这个要花一定的时间。

另一种方法是

  从[0,2*pi)中随机选一个角度,对应于圆中的一条半径,然后在此半径上选一个点。但半径上的点不能均匀选取,选取的概率应该和距圆心的长度成正比,这样才能保证随机点在圆内是均匀分布的。

http://stackoverflow.com/questions/5837572/generate-a-random-point-within-a-circle-uniformly