Java 圆内随机点法不是均匀分布的

Java 圆内随机点法不是均匀分布的,java,math,random,geometry,uniform-distribution,Java,Math,Random,Geometry,Uniform Distribution,我在Java中有以下方法: public static Vector2d random(Circle circle) { // this returns a random number between 0 and Math.PI * 2 double angle = MathUtils.random(0, Math.PI * 2); // give the point inside the unit circle // this returns a normali

我在Java中有以下方法:

public static Vector2d random(Circle circle) {
    // this returns a random number between 0 and Math.PI * 2
    double angle = MathUtils.random(0, Math.PI * 2);
    // give the point inside the unit circle
    // this returns a normalized vector from a given angle
    Vector2d point = new Vector2d(angle);
    // however, this is only along the edge
    // now add a random magnitude (because this is a normalized vector, we can just multiply it by the desired magnitude)
    double magnitude = Math.random();
    point = point.multiply(magnitude);
    // now expand this to fit the radius
    point = point.multiply(circle.getRadius());
    // now translate by circleCenter
    return point.add(circle.getCenter());
}
这确实会在定义的圆中返回一个点,但是,当您多次这样做并绘制点时,您可以清楚地看到大多数点将朝向中心

为什么会这样?我不明白我的数学怎么能做到这一点


如果你想让我在绘图上添加点的图像,如果你认为这可能有帮助,请发表评论。

你的数学有缺陷。下面解释一下原因和正确的解决方案:

任务是在一个圆内生成均匀分布的数字 (x,y)平面中半径R的。起初极坐标看起来像 一个好主意,最简单的解决方案是均匀地选取半径r 分布在[0,R],然后是角度θ均匀分布 在[0,2pi]中。但是,在原点附近有一个点的exess (0, 0)! 这是错误的,因为如果我们看一个特定的角度间隔, 比如说[theta,theta+dtheta],需要生成更多的点 再向外(大r),比接近于零。半径不得小于 从均匀分布中挑选,但是一个

pdf_r=(2/r^2)*r

通过计算累积值的倒数很容易做到这一点 分布,我们得到r:

r=r*sqrt(rand())

其中rand()是[0,1]中的统一随机数


你的数学有缺陷。下面解释一下原因和正确的解决方案:

任务是在一个圆内生成均匀分布的数字 (x,y)平面中半径R的。起初极坐标看起来像 一个好主意,最简单的解决方案是均匀地选取半径r 分布在[0,R],然后是角度θ均匀分布 在[0,2pi]中。但是,在原点附近有一个点的exess (0, 0)! 这是错误的,因为如果我们看一个特定的角度间隔, 比如说[theta,theta+dtheta],需要生成更多的点 再向外(大r),比接近于零。半径不得小于 从均匀分布中挑选,但是一个

pdf_r=(2/r^2)*r

通过计算累积值的倒数很容易做到这一点 分布,我们得到r:

r=r*sqrt(rand())

其中rand()是[0,1]中的统一随机数


当然,当
r
较小时,生成的点彼此更接近

正如@DBrowne所说,您可以通过反向CDF技巧调整密度


或者,您可以通过在
[-R,R]x[-R,R]
中绘制统一的点,并拒绝
x²+Y²>R²
这样的点(约21%)来节省功能评估。该方法推广到隐式方程已知的任何形状。

当然,当
r
较小时,生成的点彼此更接近

正如@DBrowne所说,您可以通过反向CDF技巧调整密度


或者,您可以通过在
[-R,R]x[-R,R]
中绘制统一的点,并拒绝
x²+Y²>R²
这样的点(约21%)来节省功能评估。该方法可推广到隐式方程已知的任何形状。

是的,发生这种情况的原因大致相同,即靠近两极的经线比靠近赤道的经线更近。在圆中获得均匀分布的随机点的一个非常好的方法是在外接方中获得随机点,然后拒绝掉掉落在圆之外的点。试试这个:画一个圆(或者想象你正在画一个圆)。按照你切比萨饼的方式,将比萨饼分成16等份。现在,对于从中心到外边缘的每个半径,将线段分成10个相等的部分,并沿半径放置10个等距点。我想你会注意到,这些点在靠近中心的地方似乎更密集。这就是你的随机化方法所做的工作。@ajb哦,谢谢,这帮助我把它形象化了。现在我明白为什么会发生这种情况了是的,发生这种情况的原因大致相同,即在两极附近的经线比赤道附近的经线更近。在圆中获得均匀分布的随机点的一个非常好的方法是在外接方中获得随机点,然后拒绝掉掉落在圆之外的点。试试这个:画一个圆(或者想象你正在画一个圆)。按照你切比萨饼的方式,将比萨饼分成16等份。现在,对于从中心到外边缘的每个半径,将线段分成10个相等的部分,并沿半径放置10个等距点。我想你会注意到,这些点在靠近中心的地方似乎更密集。这就是你的随机化方法所做的工作。@ajb哦,谢谢,这帮助我把它形象化了。现在我明白了为什么会这样