当前位置:  开发笔记 > 编程语言 > 正文

生成4000个独特的伪随机笛卡尔坐标FASTER?

如何解决《生成4000个独特的伪随机笛卡尔坐标FASTER?》经验,为你挑选了1个好方法。

x和y的范围是0到99.

我目前正在这样做:

excludeFromTrainingSet = []
while len(excludeFromTrainingSet) < 4000:
    tempX = random.randint(0, 99)
    tempY = random.randint(0, 99)
    if [tempX, tempY] not in excludeFromTrainingSet:
        excludeFromTrainingSet.append([tempX, tempY])

但这需要很长时间,我真的需要加快速度.

有任何想法吗?



1> aaronasterli..:

Vincent Savard的答案几乎是这里提供的第一个解决方案的两倍.


这是我的看法.它需要元组而不是列表的可用性:

def method2(size):
    ret = set()
    while len(ret) < size:
        ret.add((random.randint(0, 99), random.randint(0, 99)))
    return ret

正如其他回答者所指出的那样,确保限制是正确的.对于合理的输入,这是更好的算法O(n)而不是O(n ^ 2),因为set而不是list.另外,python在加载locals方面要比globals更有效,所以总是将这些东西放在一个函数中.

编辑:实际上,由于概率分量,我不确定它们分别是O(n)和O(n ^ 2),但如果n被视为它们看到的唯一元素的数量,则估计是正确的.当它们接近可用空间的总数时,它们都会变慢.如果您想要一个接近可用总数的点数,那么您可能最好使用:

import random
import itertools

def method2(size, min_, max_):
    range_ = range(min_, max_)
    points = itertools.product(range_, range_)
    return random.sample(list(points), size)

这将是一个记忆力,但随着点密度的增加肯定会更快,因为它避免了不止一次地查看同一点.另一个值得分析的选项(可能比上一个更好)将是

def method3(size, min_, max_):
    range_ = range(min_, max_)
    points = list(itertools.product(range_, range_))

    N = (max_ - min_)**2
    L =  N - size
    i = 1
    while i <= L:
        del points[random.randint(0, N - i)]
        i += 1
    return points

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有