zoukankan      html  css  js  c++  java
  • 478. Generate Random Point in a Circle

    Given the radius and x-y positions of the center of a circle, write a function randPoint which generates a uniform random point in the circle.

    Note:

    1. input and output values are in floating-point.
    2. radius and x-y position of the center of the circle is passed into the class constructor.
    3. a point on the circumference of the circle is considered to be in the circle.
    4. randPoint returns a size 2 array containing x-position and y-position of the random point, in that order.

    Example 1:

    Input: 
    ["Solution","randPoint","randPoint","randPoint"]
    [[1,0,0],[],[],[]]
    Output: [null,[-0.72939,-0.65505],[-0.78502,-0.28626],[-0.83119,-0.19803]]
    

    Example 2:

    Input: 
    ["Solution","randPoint","randPoint","randPoint"]
    [[10,5,-7.5],[],[],[]]
    Output: [null,[11.52438,-8.33273],[2.46992,-16.21705],[11.13430,-12.42337]]

    Explanation of Input Syntax:

    The input is two lists: the subroutines called and their arguments. Solution's constructor has three arguments, the radius, x-position of the center, and y-position of the center of the circle. randPoint has no arguments. Arguments are always wrapped with a list, even if there aren't any.

    Approach #1: Math. [Java]

    class Solution {
        double radius, x_center, y_center;
        public Solution(double radius, double x_center, double y_center) {
            this.radius = radius;
            this.x_center = x_center;
            this.y_center = y_center;
        }
        
        public double[] randPoint() {
            double r = Math.sqrt(Math.random()) * radius;
            double deg = Math.random() * 2 * Math.PI;
            double x = x_center + r * Math.cos(deg);
            double y = y_center + r * Math.sin(deg);
            return new double[]{x, y};
        }
    }
    
    /**
     * Your Solution object will be instantiated and called as such:
     * Solution obj = new Solution(radius, x_center, y_center);
     * double[] param_1 = obj.randPoint();
     */
    

      

    Analysis:

    The task is to generate uniformly distributed numbers within a circle of radius P in the (x, y) plane. At first polar coordinates seems like a great idea, and the naive solution is to pick a radius r uniformly distributed in [0, R], and then an angle theta uniformly distributed in [0, 2*PI]. But, you end up with an exess of points near the origin (0, 0)! This is wrong because if we look at a certain angle interval, say [theta, theta+dtheda], there needs to be more points generated further out (at large r), than close to zero. The radius must not be picked from a uniform distribution, but one that foes as pdf_r = (2 / R^2) * r

    That's easy enough to do by calculating the inverse of the cumulative distribution, and we get for r:

    r = R * sqrt(rand())

    where rand() is a uniform random number in [0, 1].

    Analysis:

    https://leetcode.com/problems/generate-random-point-in-a-circle/

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    PHP 文件包含之文件路径截断(转)
    如何使用Linux通用后门(转zafe)
    利用sqlmap和burpsuite绕过csrf token进行SQL注入 (转)
    正则表达式30分钟入门教程<转载>
    php empty()和isset()的区别<转载>
    $_SERVER详细资料整理(转)
    [C语言(VC)] 打造自己的键盘记录器 (zaroty)
    metasploit(MSF)终端命令大全
    linux提权总结(外文)
    kettle菜鸟学习笔记1----相关准备知识
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10900752.html
Copyright © 2011-2022 走看看