按面积加权随机选择矩形的逻辑是否正确?
问题根源分析
1. 最可能的原因:矩形权重(整数点数量)计算错误
题目要求选取的是矩形内部的整数点,所以每个矩形的有效权重不是几何面积,而是整数点的总数:(x_i - a_i + 1) * (y_i - b_i + 1)
举个例子:矩形[0,0,1,1]的整数点有(0,0)、(0,1)、(1,0)、(1,1)共4个,权重应该是4,而非几何面积1。如果你的rects_area用的是几何面积,那加权概率就完全错了,必然过不了分布校验。
2. 你的加权选择逻辑是正确的
你改编的流抽样算法确实能实现按权重加权随机选择,以你提到的面积2、3、5为例,最终每个矩形被选中的概率正好是2/10、3/10、5/10,完全符合要求:
- 第一个矩形被选中的概率:初始选中后,后续两次都不替换 →
1 * (1 - 3/5) * (1 - 5/10) = 2/10 - 第二个矩形被选中的概率:第二次替换成功,第三次不替换 →
3/5 * (1 - 5/10) = 3/10 - 第三个矩形被选中的概率:第三次替换成功(无论之前选的是谁) →
5/10 = 5/10
这是加权蓄水池抽样的标准实现,逻辑没问题。
3. 其他可能的问题
- 选点逻辑错误:选中矩形后,x坐标要在
[a_i, x_i]范围内随机选整数,y坐标同理。必须用random.randint(a_i, x_i),如果用浮点转换再取整,可能会出现边界点概率异常的情况。 - 浮点数精度:当总面积极大时,
rects_area[i]/total_area可能有精度损失,但Leetcode测试用例一般不会极端到这个程度,优先级低于前两个问题。
修正建议
- 修正权重计算:
self.rects_area = [] for a, b, x, y in rects: # 计算矩形内整数点的总数 point_count = (x - a + 1) * (y - b + 1) self.rects_area.append(point_count)
- 修正选点逻辑:
# 选中矩形后生成随机点 a, b, x, y = self.rects[selected] rand_x = random.randint(a, x) rand_y = random.randint(b, y) return [rand_x, rand_y]
内容的提问来源于stack exchange,提问作者user13079354
相关产品推荐
相关产品推荐

