【问题标题】:How to select distinct random points in grid如何在网格中选择不同的随机点
【发布时间】:2017-02-07 02:20:31
【问题描述】:

我有一个 2D 列表,我需要从这个 2D 列表中选择 n 不同的随机点(x,y 坐标)。让我先写一下当我试图解决这个问题时发生的事情。

假设网格是300 x 400

  • 笛卡尔积300 x 400 得到120000 元素的列表,而不是使用random.choice (大网格慢)
  • 将所选点保留在一个集合中,如果产生重复点,则在 while 循环中再次随机化。 (如果 n 很大,则非常缓慢且不可预测)

我在 SO 中搜索了一些类似的问题,但都没有直接解决问题。我确实找到了This question,虽然用户回答了这个问题,但他们没有提供 Python 解决方案,我们可能会在这个问题中提出。如果不是代码本身,也许可以建议在 Python 标准库中使用适当的数据结构。

【问题讨论】:

    标签: python algorithm random time-complexity


    【解决方案1】:

    使用random.sample 从范围中进行采样而不进行替换——范围对象有一个快速的特殊情况。 divmod(i, h) 是从具有w * h 元素的一维范围内的i 到二维网格中的(x, y) 的字典映射。

    Python 3:

    import random
    def samplegrid(w, h, n):
        return [divmod(i, h) for i in random.sample(range(w * h), n)]
    

    Python 2:

    import random
    def samplegrid(w, h, n):
        return [divmod(i, h) for i in random.sample(xrange(w * h), n)]
    

    【讨论】:

    • 这似乎有效,您能否解释一下它是如何工作的以及如何避免重复?
    • @Rockybilly random.sample 样品无需更换。我链接了文档。
    • 我之前用过random.sample,只是除法的技巧让我很困惑,将随机数除以h实际上提供了区别?
    • @Rockybilly 这是商和余数,所以是的。倒数是lambda x, y: x * h + y
    • @Rockybilly 取决于您对发行版的挑剔程度。如果近似均匀是可以的,使用cover tree 找到最接近随机选择的候选者的前一个点,保留那些足够远的候选者。
    猜你喜欢
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多