Generate a random point within a circle (uniformly)

前端 未结 21 2321
逝去的感伤
逝去的感伤 2020-11-22 15:45

I need to generate a uniformly random point within a circle of radius R.

I realize that by just picking a uniformly random angle in the interval [0 ... 2π),

相关标签:
21条回答
  • 2020-11-22 16:35

    Such a fun problem.
    The rationale of the probability of a point being chosen lowering as distance from the axis origin increases is explained multiple times above. We account for that by taking the root of U[0,1]. Here's a general solution for a positive r in Python 3.

    import numpy
    import math
    import matplotlib.pyplot as plt
    
    def sq_point_in_circle(r):
        """
        Generate a random point in an r radius circle 
        centered around the start of the axis
        """
    
        t = 2*math.pi*numpy.random.uniform()
        R = (numpy.random.uniform(0,1) ** 0.5) * r
    
        return(R*math.cos(t), R*math.sin(t))
    
    R = 200 # Radius
    N = 1000 # Samples
    
    points = numpy.array([sq_point_in_circle(R) for i in range(N)])
    plt.scatter(points[:, 0], points[:,1])
    

    0 讨论(0)
  • 2020-11-22 16:36

    There is a linear relationship between the radius and the number of points "near" that radius, so he needs to use a radius distribution that is also makes the number of data points near a radius r proportional to r.

    0 讨论(0)
  • 2020-11-22 16:36

    I don't know if this question is still open for a new solution with all the answer already given, but I happened to have faced exactly the same question myself. I tried to "reason" with myself for a solution, and I found one. It might be the same thing as some have already suggested here, but anyway here it is:

    in order for two elements of the circle's surface to be equal, assuming equal dr's, we must have dtheta1/dtheta2 = r2/r1. Writing expression of the probability for that element as P(r, theta) = P{ r1< r< r1 + dr, theta1< theta< theta + dtheta1} = f(r,theta)*dr*dtheta1, and setting the two probabilities (for r1 and r2) equal, we arrive to (assuming r and theta are independent) f(r1)/r1 = f(r2)/r2 = constant, which gives f(r) = c*r. And the rest, determining the constant c follows from the condition on f(r) being a PDF.

    0 讨论(0)
提交回复
热议问题