Python 有没有办法提高生成随机x-y坐标的算法的效率?

Python 有没有办法提高生成随机x-y坐标的算法的效率?,python,arrays,algorithm,space-complexity,Python,Arrays,Algorithm,Space Complexity,我正在研究一种算法,它可以在一张大图像上随机绘制物体。这是我目前的工作流程 我定义一个表示图像尺寸的空间,并启动一个空数组(restrictList) 使用genLoc函数,我随机选取一个点(x,y)。拾取第一个点时,限制列表为空 然后计算对象将占用的所有点。这些点将添加到阵列(限制列表) 然后我再次调用genLoc,选择另一个随机变量(x,y)。如果(x,y)exists为restrictList,则该函数将再次调用自身 这将继续,直到我们选择了一个不在限制列表中的随机点 问题如下,随着绘制的

我正在研究一种算法,它可以在一张大图像上随机绘制物体。这是我目前的工作流程

  • 我定义一个表示图像尺寸的空间,并启动一个空数组(restrictList)
  • 使用genLoc函数,我随机选取一个点(x,y)。拾取第一个点时,限制列表为空
  • 然后计算对象将占用的所有点。这些点将添加到阵列(限制列表)
  • 然后我再次调用genLoc,选择另一个随机变量(x,y)。如果(x,y)exists为restrictList,则该函数将再次调用自身
  • 这将继续,直到我们选择了一个不在限制列表中的随机点
  • 问题如下,随着绘制的对象越来越多,array-restrictList的大小也会增加。在每次迭代中,选择一个有效的随机点需要更长的时间。我在这里看到的最大缺陷是,我重复从图像空间中拾取一个随机坐标,这是在浪费处理能力。我尝试的一种替代方法是使用数组-
    [x代表x,如果x不在限制列表中,则代表所有可能的点]
    并选择一个随机索引。这需要更长的时间,因为数组AllPossiblePoints非常大。我想我需要一种方法来确保restrictList中的(x,y)坐标不会首先被随机生成

    def genLoc(x,y, restrictList):
    
    Valx = randint(0, x)
    Valy = randint(0, y)
    
    point = (Valx, Valy)
    if point in restrictList:
        return genLoc(dimx, dimy, restrictList)
    
    elif point not in restrictList:
        return point
    
    修改


    此解决方案要求您提前生成所有可能的坐标。它使用集合和集合逻辑来消除使用时的可能性。random.sample用于从可能的点中选择一个点。我的mre是为了说明-(一切都是线性的)


    s.difference\u update(t)
    的时间复杂度为O(len(t))

    这解决了寻找尚未使用的随机坐标的问题


    无法评估预先创建所有坐标的成本。如果成本太高,那么可能不得不重新寻找可用的坐标。使用集合保留所有限制点将减少成员资格测试的时间。

    我看到的一个常见解决方案是随机洗牌
    所有可能的点
    ,然后只从末尾剥离项目。这是否回答了您的问题?否则使用整个点空间的
    random.sample
    points=random.sample(所有可能的点,所放置对象的编号)
    -我认为只有当x和y没有显著的大小时,这才是一个好方法。是这样吗?使用集合而不是列表来保存限制点。这应该会有所帮助,感谢您的回答,问题是当选择一个点时,其周围的一定数量的点(x,y)不再有效。这是基于我们正在绘制的最大对象。我这样做是为了在绘图时没有重叠。例如,我们首先选择(10,5)并使用它来绘制对象(y),假设最大的对象是(z)。以下矩形中的所有点都无效(10长度(z)、5高度(z)、10+长度(y)、5+高度(y)。在我的解决方案中,这些点位于restrictList数组中。
    import random
    
    # fake function that identifies
    # unusable points after placing an object
    def calc_objectspace(point,obj=None):
        objdims = range(-5,5)
        # linear all the same size
        objspace = set(point+n for n in range(-5,5))
        objspace.add(point)    # as needed
        return objspace
    
    # make all the points as a set
    allthestuff = set(range(10000))
    
    # iterate over the objects getting placed
    for obj in range(10):
        # random.choice won't work with a set
        point = random.sample(allthestuff,1)[0]
        # determine occupied points
        obj_space = calc_objectspace(point)
        # reduce the possible points
        allthestuff.difference_update(obj_space)
        print(len(allthestuff))