更快地生成4000个唯一的伪随机笛卡尔坐标?

2024-10-01 07:14:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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])

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

有什么想法吗?在


Tags: inlenifnotrandomrandintappendwhile
3条回答

我的建议是:

def method2(size):
    randints = range(0, 100)
    excludeFromTrainingSet = set()

    while len(excludeFromTrainingSet) < size:
        excludeFromTrainingSet.add((random.choice(randints), random.choice(randints)))
    return excludeFromTrainingSet

从第2代随机数中选择一个,然后从第2代中选择随机数,然后每隔一代生成一个随机数。正如其他人所指出的,只有10000种可能性,所以在你得到40000个之前你不能循环,但是你得到了要点。在

我肯定会有人来这里使用numpy,但是使用set和tuple怎么样? E、 g.:

excludeFromTrainingSet = set()
while len(excludeFromTrainingSet) < 40000:
    temp = (random.randint(0, 99), random.randint(0, 99))
    if temp not in excludeFromTrainingSet:
        excludeFromTrainingSet.add(temp)

编辑:这不是一个无限循环,因为只有100^2=10000个可能的结果,而你一直等到得到40000个结果?在

Vincent Savard的answer速度几乎是这里提供的第一个解决方案的两倍。在


这是我的看法。它需要元组而不是列表来实现哈希:

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),因为这是集合而不是列表。而且,python在加载局部变量方面比全局变量更有效,所以总是将这些内容放在函数中。在

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

^{pr2}$

这将是一个内存占用,但肯定会随着点密度的增加而更快,因为它避免了多次查看同一个点。另一个值得分析的选项(可能比上一个更好)是

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

相关问题 更多 >