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])
但这需要很长时间,我真的需要加快速度.
有任何想法吗?
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