'A random point on the ellipse.
Returns
point : Point
See Also
sympy.geometry.point.Point
arbitrary_point : Returns parameterized point on ellipse
Notes
A random point may not appear to be on the ellipse, ie, `p in e` may
return False. This is because the coordinates of the point will be
floating point values, and when these values are substituted into the
equation for the ellipse the result may not be zero because of floating
point rounding error.
Examples
>>> from sympy import Point, Ellipse, Segment
>>> e1 = Ellipse(Point(0, 0), 3, 2)
>>> e1.random_point() # gives some random point
Point2D(...)
>>> p1 = e1.random_point(seed=0); p1.n(2)
Point2D(2.1, 1.4)
The random_point method assures that the point will test as being
in the ellipse:
>>> p1 in e1
True
Notes
An arbitrary_point with a random value of t substituted into it may
not test as being on the ellipse because the expression tested that
a point is on the ellipse doesn\'t simplify to zero and doesn\'t evaluate
exactly to zero:
>>> from sympy.abc import t
>>> e1.arbitrary_point(t)
Point2D(3*cos(t), 2*sin(t))
>>> p2 = _.subs(t, 0.1)
>>> p2 in e1
False
Note that arbitrary_point routine does not take this approach. A value
for cos(t) and sin(t) (not t) is substituted into the arbitrary point.
There is a small chance that this will give a point that will not
test as being in the ellipse, so the process is repeated (up to 10
times) until a valid point is obtained.'

def random_point(self, seed=None):

    from sympy import sin, cos, Rational
    t = _symbol('t')
    (x, y) = self.arbitrary_point(t).args
    if (seed is not None):
        rng = random.Random(seed)
    else:
        rng = random
    for i in range(10):
        c = ((2 * Rational(rng.random())) - 1)
        s = sqrt((1 - (c ** 2)))
        p1 = Point(x.subs(cos(t), c), y.subs(sin(t), s))
        if (p1 in self):
            return p1
    raise GeometryError('Having    problems    generating    a    point    in    the    ellipse.')
