友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

478. 在圆内随机生成点

给定圆的半径和圆心的位置,实现函数 randPoint,在圆中产生均匀随机点。

实现 Solution 类:

  • Solution(double radius, double x_center, double y_center) 用圆的半径 radius 和圆心的位置 (x_center, y_center) 初始化对象

  • randPoint() 返回圆内的一个随机点。圆周上的一点被认为在圆内。答案作为数组返回 [x, y]

示例 1:

输入:
["Solution","randPoint","randPoint","randPoint"]
[[1.0, 0.0, 0.0], [], [], []]
输出: [null, [-0.02493, -0.38077], [0.82314, 0.38945], [0.36572, 0.17248]]
解释:
Solution solution = new Solution(1.0, 0.0, 0.0);
solution.randPoint ();//返回[-0.02493,-0.38077]
solution.randPoint ();//返回[0.82314,0.38945]
solution.randPoint ();//返回[0.36572,0.17248]

提示:

  • 0 < radius <= 108

  • -107 <= x_center, y_center <= 107

  • randPoint 最多被调用 3 * 104

思路分析

利用图像平移+拒绝采样,以 (r, r) 点为圆心,随机生成 xy 坐标的点,计算距离圆心的距离,符合要求则将 (rx, ry) 平移 (x-r, y-r) 即可。不符合要求,则再次随机生成。

  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2025-09-04 21:48:11
 */
class Solution {
  private double x;
  private double y;
  private double r;
  private Random random;

  public Solution(double radius, double x_center, double y_center) {
    this.x = x_center;
    this.y = y_center;
    this.r = radius;
    random = new Random();
  }

  public double[] randPoint() {
    // 循环法
    while (true) {
      double rx = random.nextDouble(2 * r);
      double ry = random.nextDouble(2 * r);
      if (Math.pow(r - rx, 2) + Math.pow(r - ry, 2) <= Math.pow(r, 2)) {
        return new double[]{rx + (x - r), ry + (y - r)};
      }
    }
    // 递归法
    //  double rx = random.nextDouble(2 * r);
    //  double ry = random.nextDouble(2 * r);
    //  if (Math.pow(r - rx, 2) + Math.pow(r - ry, 2) > Math.pow(r, 2)) {
    //    return randPoint();
    //  } else {
    //    return new double[]{rx + (x - r), ry + (y - r)};
    //  }
  }
}