首页 > 编程问答 >选择一个随机矩形但按面积加权:

选择一个随机矩形但按面积加权:

时间:2024-07-27 15:36:02浏览次数:5  
标签:python probability-density

在用 Leetcode 做一些练习时,我遇到了一个问题,需要从一组不重叠的矩形中选择内部的随机整数点( https://leetcode.com/problems/random-point-in-non-overlapping -矩形/描述/ )。虽然选择随机整数点有点微不足道,但问题要求点选择在所有矩形的整个区域中具有相同的可能性。

我提出的解决方案是随机选择一个矩形,但对区域和区域进行加权,从内部随机选择整数点。在 python 中,我一直在使用以下代码:

# select one rectangle randomly but weighting rectangles areas
selected = 0
total_area = self.rects_area[0]

for i in range(1, len(self.rects_area)):
    total_area += self.rects_area[i]
    selected = i if random() <= self.rects_area[i] / total_area else selected

with:

- rects: List[List[int]], with rects[i] = [ai, bi, xi, yi], (ai, bi) -> bottom left and (xi,yi) -> top right
- rects_area List[int]: area of each rects[i] using the same indexing

我通过了 35 个测试中的 31 个,但最后 4 个似乎考虑了分布。所以,我的问题是最后一行(selected = i if...)是否确实随机选择了一个矩形,但根据大小加权。我得到的见解来自一个著名的问题,在这个问题中,你必须从一个流中随机选择数字,而你不知道会出现多少个数字。第一个是 1/1,第二个是 1/2,第三个是 1/3,依此类推,所以我将其调整为使用面积作为分子,并将到该点的总面积作为分母。那么,对于 3 个三角形面积:2,3 和 5,概率将为 2/2、3/5 和 5/7。

有什么建议吗?


你的逻辑在随机选择加权矩形方面几乎是正确的,但有一个小错误。问题在于,你每次迭代都会更新 selected ,这并不符合概率分布。你应该更新 selected 的概率仅在当前矩形的加权面积大于随机数时才成立。

以下是用 Python 修正代码的方法:

# 选择一个随机矩形,但对矩形面积进行加权
selected = 0
total_area = self.rects_area[0]

for i in range(1, len(self.rects_area)):
    total_area += self.rects_area[i]
    # 仅当随机数小于或等于加权概率时才更新 selected
    if random() < self.rects_area[i] / total_area: 
        selected = i 

以下是你的代码工作原理以及我们如何改进它的细分:

  1. 初始化:
  2. 你正确地初始化了 selected = 0 total_area 为第一个矩形的面积。

  3. 迭代矩形:

  4. 你遍历了从第二个矩形开始的矩形列表。
  5. 在每次迭代中,你都正确地更新了 total_area

  6. 加权选择(需要修正的地方):

  7. 你最初的条件 random() <= self.rects_area[i] / total_area 在逻辑上存在缺陷。你不能在每次迭代中都更新 selected 。你应该更新 selected 的概率仅在当前矩形的加权面积大于随机数时才成立。

通过仅当随机数落在当前矩形的加权概率范围内时才更新 selected ,你确保了选择过程准确地反映了每个矩形的面积。

此修正后的代码将根据其面积正确地随机选择一个矩形,从而解决你遇到的分布问题。

标签:python,probability-density
From: 78800798

相关文章

  • python datetime timedelta 对于没有小数部分的时间返回 0.0
    我正在使用datetime.timedelta来获取python中进程的持续时间。defget_time_difference(start_time,end_time):time_in_seconds=(end_time-start_time)returnstr(datetime.timedelta(seconds=time_in_seconds))[:-3]文档指出“所有参数都是可选的......
  • 如何运行从我正在编写的另一个 Python 脚本获取命令行参数的 Python 脚本?
    我有一个python3脚本,如下所示:...defmain():parser=argparse.ArgumentParser(description='Performnormalisationchecksonpass2files')parser.add_argument('-p','--parser',action='store',help='parse......
  • Python 抓取 urllib2 HTTP 错误
    我正在尝试抓取一个网站,但我的代码仅在我打开该网站然后刷新它时才有效。我尝试了多种方法,但不断出现以下两个错误:第一个:ValueError:“HTTPError:HTTP错误416:请求的范围无法满足”urlslist=open("list_urls.txt").read()urlslist=urlslist.split("\n")forurlslistinurl......
  • 【Python】利用 face_recognition 库进行人脸检测识别【附完整示例】
    1.背景条件1.1安装所需库首先安装face_recognition和Pillow这两个库。您可以使用以下命令来安装它们:pipinstallface_recognitionPillow-ihttps://pypi.tuna.tsinghua.edu.cn/simple1.2拷贝代码安装完成后,您就可以在本地运行以下提供的代码了。importfac......
  • 太强了,Python+Excel真的是神仙组合!
    本书是由流行开源Python库xlwings的创始人:费利克斯·朱姆斯坦(FelixZumstein)所撰写。他详细阐述了如何将Python与Excel结合使用,让任务自动化,从而实现效率飞跃。为了帮助初学者克服对Python的恐惧,作者特意将教程内容设计成从简单到复杂的顺序进行介绍。这本书PDF共282页,分为4个......
  • 在 Python 中获取精确的 Android GPS 位置
    我尝试在Python中获取Android手机的GPS位置(使用QPython3应用程序)。这种可行,但是Android中似乎有几个LocationProvider:gps:纯gps定位,速度慢,耗能,但非常准确,正是我所需要的。网络:GPS和wifi/小区定位的混合,更快,但不太准确被动......
  • 使用 docker run 将 Python 单击选项传递给 ENTRYPOINT 会出现错误:“在 $PATH 中找不
    我有一个简单的python脚本,我想在docker容器内运行它。它打印一行消息“Hello{name}”。python脚本使用clickCLI界面来定义收件人名称,如果我直接运行它(不使用dockerrun命令),它将如下所示:pythonhello.py-nSmithDockerbuild命令:dockerbuild.-thello:1.......
  • 标题:在 OpenSees Python 中定义具有特定卸载行为的双线性弹塑性材料
    我正在使用Python中的OpenSees,我想定义一种在负载下表现出双线性弹塑性行为的材料。但是,我需要在卸载过程中将材质返回到其原始位置,遵循准确的加载路径。在此处输入图像描述我不确定如何在OpenSees中正确实现卸载行为,我正在寻找实现这一具体材料反应的指导。......
  • 使用正则表达式删除Python中常见的公司名称后缀
    我正在努力删除一些公司名称中的后缀。预期结果如下:原始名称:AppleInc.SonyCorporationFiatChryslerAutomobilesS.p.A.SamsungElectronicsCo.,Ltd.清除名称:AppleSonyFiatChryslerAutomobilesSamsungElectronics到目前为止我所做的:importred......
  • 如何将 Brave 网络浏览器与 python、selenium 和 chromedriver 结合使用?
    我从Google的Chrome切换到Brave网络浏览器并且很难让它像Chrome一样与Brave一起使用。Brave是基于Chromium的,所以我猜它应该不会那么难。我确保我的Brave和Chromedriver处于相同版本,像这样,~/some/path$chromedriver--versionChromeDriver76.0.3......