LeetCode-Go 题解 478:Generate Random Point in a Circle 圆内均匀随机取点

发布时间:2026/11/10 13:24:44

LeetCode-Go 题解 478:Generate Random Point in a Circle 圆内均匀随机取点 LeetCode-Go 题解 478Generate Random Point in a Circle 圆内均匀随机取点【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go导读本文基于 LeetCode-Go 仓库中 0478.Generate-Random-Point-in-a-Circle 题目文档完整剖析 LeetCode 478「Generate Random Point in a Circle」这道经典的均匀随机采样题给定圆的半径与圆心坐标实现一个randPoint函数在圆内含圆周产生均匀分布的随机点。读完本文你将掌握拒绝采样Rejection Sampling与极坐标Polar Coordinates两种取点算法的数学原理与 Go 实现差异并了解本仓库题解的单元测试与覆盖率验证方式可直接复用到任意「在几何区域中均匀采样」的场景。题目背景与输入输出约定原题描述给定圆的半径和圆心的 x、y 坐标编写一个函数randPoint该函数在圆中生成一个均匀随机点。原题给出了四条关键说明输入和输出值都是浮点数圆的半径和圆心的 x、y 坐标通过类构造函数传入圆周上的点也认为在圆中randPoint返回一个包含 x 坐标和 y 坐标的大小为 2 的数组顺序为先 x 后 y。输入语法说明LeetCode 的输入由两个列表组成被调用的子程序及其参数。Solution的构造函数接收三个参数——半径、圆心 x 坐标、圆心 y 坐标randPoint无参数。参数即使为空也会用列表包裹例如Input: [Solution,randPoint,randPoint,randPoint] [[1,0,0],[],[],[]] Output: [null,[-0.72939,-0.65505],[-0.78502,-0.28626],[-0.83119,-0.19803]]第二个示例将半径放大到 10、圆心移到(5, -7.5)Input: [Solution,randPoint,randPoint,randPoint] [[10,5,-7.5],[],[],[]] Output: [null,[11.52438,-8.33273],[2.46992,-16.21705],[11.13430,-12.42337]]由于每次输出都是随机结果原题并不校验具体数值只要满足均匀分布与「在圆内」即可。核心数学约束圆内任意一点必然满足圆的定义方程(x-a)² (y-b)² ≤ R²其中(a, b)是圆心坐标R是半径。题目要求「均匀随机」意味着圆内每一小块面积被命中的概率应当与它的面积成正比——这是本题最容易踩坑的地方下文会重点对比两种算法在均匀性上的差异。解题思路一拒绝采样本题解采用仓库题解见 核心实现源码采用的思路如下先假设圆心在 (0,0)这样便于计算最终输出坐标时整体加上圆心偏移量即可用rand.Float64()产生[0.0, 1.0)区间的浮点数构造-R ≤ 2 * R * rand() - R R的横纵坐标候选点判断候选点是否满足x² y² ≤ R²满足则说明点在圆内返回不满足则重新采样直到命中为止。这就是经典的拒绝采样先在一个包含圆的外接正方形内均匀撒点再把落在圆外的点丢弃。从期望上看正方形面积为(2R)² 4R²圆面积为πR²因此每次采样被接受的概率为π/4 ≈ 78.5%平均约 1.27 次即可得到一个有效点效率完全可接受。关键代码func (this *Solution) RandPoint() []float64 { for { rx : 2*rand.Float64() - 1.0 ry : 2*rand.Float64() - 1.0 x : this.r * rx y : this.r * ry if x*xy*y this.r*this.r { return []float64{x this.x, y this.y} } } }几点细节值得注意2*rand.Float64() - 1.0将[0,1)映射到[-1,1)再乘以半径this.r得到以原点为中心、边长为2R的正方形内的候选坐标判定条件x*xy*y this.r*this.r用的是平方比较而非math.Sqrt既避免了开方带来的浮点开销也精确满足了「圆周上的点也算在圆内」的要求命中后将(x, y)加上圆心偏移(this.x, this.y)再返回完成了从原点坐标系到真实坐标系的平移。构造函数的随机种子构造函数中显式调用rand.Seed(time.Now().UnixNano())以纳秒时间戳初始化全局随机数种子避免每次程序启动都产生相同序列func Constructor(radius float64, x_center float64, y_center float64) Solution { rand.Seed(time.Now().UnixNano()) return Solution{radius, x_center, y_center} }Solution结构体只保存三份状态半径r、圆心横坐标x、圆心纵坐标y与题目要求完全对应。解题思路二极坐标均匀采样代码注释中保留在题解的RandPoint函数顶部保留了一段被注释掉的极坐标实现/* a : angle() r : this.r * math.Sqrt(rand.Float64()) x : r * math.Cos(a) this.x y : r * math.Sin(a) this.y return []float64{x, y}*/其配套的辅助函数angle()返回一个0, 2π)区间的随机角度func angle() float64 { return rand.Float64() * 2 * math.Pi }这段被注释的代码之所以数学上更优雅在于两个关键点角度均匀采样angle()用rand.Float64() * 2 * math.Pi产生[0, 2π)的随机角度保证方向无偏半径必须开方r this.r * math.Sqrt(rand.Float64())。这里rand.Float64()在[0,1)上均匀直接取r R * u会导致点集中在圆心附近面积小的同心圆环被过度采样。面积与r²成正比因此需要对均匀量开方——r R·√u才能让每个面积微元被命中的概率相等。这是「圆内均匀采样」最容易出错的数学细节。极坐标法的优势是零拒绝、单次即可返回时间复杂度严格为 O(1)劣势是需要调用math.Sqrt、math.Cos、math.Sin三个超越函数。拒绝采样法只用到乘法与比较无三角函数开销且代码更直观。两种方法在本仓库中都以源码形式保留方便读者对比学习。题解最终选择了拒绝采样作为正式提交版本可推断是出于常数开销与代码可读性的综合考量。单元测试与覆盖率验证本仓库为每题都配套了单元测试本题测试见 [478. Generate Random Point in a Circle_test.gofunc Test_Problem478(t *testing.T) { obj : Constructor(1, 0, 0) fmt.Printf(RandPoint() %v\n, obj.RandPoint()) fmt.Printf(RandPoint() %v\n, obj.RandPoint()) fmt.Printf(RandPoint() %v\n, obj.RandPoint()) obj Constructor(10, 5, -7.5) fmt.Printf(RandPoint() %v\n, obj.RandPoint()) fmt.Printf(RandPoint() %v\n, obj.RandPoint()) fmt.Printf(RandPoint() %v\n, obj.RandPoint()) a : angle() if a 0 || a 2*math.Pi { t.Fatalf(angle() %v, want in [0, 2*Pi), a) } fmt.Printf(angle() %v\n, a) }测试覆盖了两个关键场景两组典型构造参数Constructor(1, 0, 0)单位圆、原点与Constructor(10, 5, -7.5)对应题目示例二各调用三次RandPoint()验证程序可正常运行并输出合理浮点坐标angle()的区间合法性显式断言返回角度满足0 ≤ a 2π从边界上验证了极坐标辅助函数的正确性。此外仓库根目录的 coverage.txt 记录了全库覆盖率数据其中本题实现被完整执行构造函数调用 2 次、RandPoint的拒绝循环与命中分支、angle()均被覆盖对应记录位于github.com/halfrost/LeetCode-Go/leetcode/0478.Generate-Random-Point-in-a-Circle/...符合仓库 100% test coverage 的整体要求。覆盖率统计由根目录的 gotest.sh 生成其核心命令为go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...若要在本地复现测试结果可在仓库根目录执行go test ./leetcode/0478.Generate-Random-Point-in-a-Circle/... -v本仓库 go.mod 声明go 1.19上述命令需在 Go 1.19 及以上环境中运行。正确性与复杂度分析正确性拒绝采样保证返回点必然满足x² y² ≤ R²含圆周符合题意候选点在正方形内均匀分布条件概率下圆内点依然均匀时间复杂度每次采样 O(1)期望调用次数为1/(π/4) ≈ 1.27总体期望 O(1)空间复杂度O(1)仅常数级状态。延伸如何验证采样均匀性LeetCode 判题只校验「点在圆内」不校验分布。若要在工程中验证均匀性可统计大量采样点落入不同同心圆环面积相等的环带的频次或计算各象限、各扇区的样本占比是否接近理论值。对拒绝采样实现可额外记录拒绝率是否收敛到1 - π/4 ≈ 21.5%以此侧面验证随机数生成与判定逻辑的正确性。小结本题是「几何区域均匀采样」的入门经典LeetCode-Go 仓库的题解README 题解文档、核心实现、单元测试同时提供了拒绝采样与极坐标开方两种思路前者以约 78.5% 的接受率换取简洁与低常数开销后者以√u半径变换实现单次无拒绝采样。理解「均匀半径必须开方」与「拒绝采样收敛性」这两个核心点即可举一反三将同类技巧迁移到球面、多边形、不规则几何体等更复杂的均匀采样场景。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/10 15:55:21

通辽高压电工证考试丢了怎么补办,全国通用怎么操作最稳妥

通辽高压电工证考试丢了怎么补办,全国通用怎么操作最稳妥 之前考的证在外省能不能转过来?很多人问过这个问题,特别是像你这样在通辽从事高压电工工作的,可能之前在别处考的证,现在想在当地上岗,又担心证件是否全国通用,或者丢了怎么办,这些问题其实都…

2026/11/10 15:55:21

电工证直考的优缺点在哪考才靠谱

电工证直考的优缺点在哪考才靠谱 实操考试心里没底怕挂科,电工证直考确实让人又爱又恨。一边是省时省力的便捷,一边是实操不过关的焦虑。很多人在考前都会纠结,到底要不要走直考这条路。特别是对于刚入行的电工或者想转行的人来说,直考几乎是他们最直接的…

2026/11/10 15:55:21

办理考取电工证的书籍需要什么材料

电工证怎么考?郑州报考避坑指南,一本好书能帮你少走弯路 你还在为找不到电工证怎么考而发愁?急需特种作业证才能上岗找工作,但不知道从哪下手?尤其是在郑州,考试流程、材料准备、书籍选择、报名条件等信息错综复杂,稍有不慎就可能被坑。今天我就从一个…

2026/11/10 15:50:20

重庆高级电工证考试网上查询怎么查 实操考试心里没底怕挂科

重庆高级电工证考试网上查询怎么查 实操考试心里没底怕挂科 你是不是正准备参加重庆高级电工证考试,实操考试心里没底怕挂科?别担心,这种感觉很正常,毕竟不是每个人都对高压电流、线路接线、设备操作了如指掌。但是,你知道吗?只要提前准备、熟悉流程,…

2026/11/10 8:12:38

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/10 0:01:28

学历不高怕报不上名?考电工证报名费+网上查询全攻略来了

学历不高怕报不上名?考电工证报名费+网上查询全攻略来了 你是不是也担心自己学历不高,考电工证报名费太贵,根本报不上名?别急,今天就来给你讲讲,怎么用最少的钱,把证拿到手,还能在工地上多挣点钱。 电工证报名费多少钱?网上查询是关键…

2026/11/10 0:01:29

绍兴考电工证培训机构怎么选?2026河南最新政策别错过

绍兴考电工证培训机构怎么选?2026河南最新政策别错过 怕考不过白交培训费?你不是一个人。2026河南最新政策出台,对电工证考试、报名、培训、复审都有明确规定。选择绍兴考电工证培训机构,别再踩坑,下面一步步教你避坑。…

2026/11/9 6:30:27

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑