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)
  • 相关阅读:
    Android 编程下 Eclipse 恢复被删除的文件
    Android 编程下背景图片适配工具类
    Android 编程下 Managing Your App's Memory
    Android 编程下代码之(QQ消息列表滑动删除)
    Android 编程下 Canvas and Drawables
    Android 编程下 AlarmManager
    Android 编程下去除 ListView 上下边界蓝色或黄色阴影
    Java 编程下字符串的 16 位、32位 MD5 加密
    C#枚举类型和int类型相互转换
    MVC和普通三层架构的区别
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10900752.html
Copyright © 2011-2022 走看看