如何使用高斯分布计算 java 中靶心上的随机点

How to use a gaussian distribution to calculate a random point on a bullseye in java

我一直在做一个项目,我需要能够 return 正方形中的一个点,它的作用有点像靶心。我想让它 return 成为一个遵循高斯分布的点,这意味着在生成大量结果之后,我们会看到大多数点在中心附近生成,并且随着它向外部限制的方向移动,数量会减少广场的。解决此问题的最佳方法是什么?

我有一个方法,如下所示:

    public static Point randomPoint(final Random random, final Point center,
        final double sd) {
        Point p = null;

        return p;
    }

但我真的不知道该从哪里开始。对于一般数字,随机高斯数将只使用具有均值和标准差的最小值和最大值。我会在这里做类似的事情,但对 x 和 y 做最小值和最大值吗?

要生成对称的二维高斯分布,实际上只需生成2个独立的高斯数并将它们作为x和y,如下所示:

new Point(center.getX()+random.nextGaussian()*sd, 
          center.getY()+random.nextGaussian()*sd);

但是请注意,平均值(中心)和偏差(我假设您的示例中的 'sd')不等于 min/max。它基本上意味着大约所有点的 2/3 将小于 'sd' 远离中心,大约 95% 将至多 '2*sd' 远。然而,所有点都有 non-zero 概率,无论多远。

这意味着,您可能希望 'crop' 指向您感兴趣的矩形。但是请注意,有两种方法可以做到这一点:

  • 如果一个点在矩形之外,就把它放在边界上(也就是做 min/max 检查,如果超出边界则取 min/max)
  • 如果点超出范围则重复生成

第一个可能会使您的分布变形,因为一个点更有可能正好位于边界上,而不是它应该在的边界上。第二个花费更多的处理,但是它会保留分布。