Vincent Savard a un answer presque deux fois plus rapide que la première solution proposée ici.
Voici mon point de vue. Il faut tuples au lieu des listes pour hashability:
def method2(size):
ret = set()
while len(ret) < size:
ret.add((random.randint(0, 99), random.randint(0, 99)))
return ret
Assurez-vous que la limite est sain d'esprit que d'autres answerers ont souligné. Pour une entrée sensée, c'est mieux algorithmiquement O (n) que O (n^2) à cause de l'ensemble au lieu de la liste. En outre, python est beaucoup plus efficace pour charger les locales que les globals, donc mettez toujours ce truc dans une fonction.
EDIT: En fait, je ne suis pas sûr qu'ils soient O (n) et O (n^2) respectivement à cause de la composante probabiliste mais les estimations sont correctes si n est pris comme le nombre d'éléments uniques ils voient. Ils seront tous les deux plus lents à mesure qu'ils s'approcheront du nombre total d'espaces disponibles. Si vous voulez un montant de points qui se rapproche du nombre total disponible, alors vous pourriez être mieux d'utiliser:
import random
import itertools
def method2(size, min_, max_):
range_ = range(min_, max_)
points = itertools.product(range_, range_)
return random.sample(list(points), size)
Ce sera un porc de mémoire mais il est sûr d'être plus rapide que la densité des augmentations de points car elle évite regardant le même point plus d'une fois.Une autre option de profilage vaut (probablement mieux que dernier) serait
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
je pourrais manquer quelque chose, mais ne sont pas là seulement 10000 coordonnées entières uniques * x-y * pour * x * et * y * entre 0 et 99? – fideli
Comment est-ce aléatoire si vous excluez ce que vous avez déjà mis là-bas. Et pourquoi utilisez-vous une liste au lieu d'un tuple? – Falmarri
@fideli Lol. C'est un bon point. Quoi qu'il en soit, je pourrais avoir besoin de faire cela pour de plus grandes plages donc la question est toujours pertinente. –