Je voudrais créer une liste aléatoire d'entiers à des fins de test. La distribution des nombres n'est pas importante. La seule chose qui compte est temps. Je sais que la génération de nombres aléatoires est une tâche qui prend beaucoup de temps, mais il doit y avoir un meilleur moyen.Créer une liste aléatoire d'entiers en Python
Voilà ma solution actuelle:
import random
import timeit
# random lists from [0-999] interval
print [random.randint(0,1000) for r in xrange(10)] # v1
print [random.choice([i for i in xrange(1000)]) for r in xrange(10)] # v2
# measurement:
t1 = timeit.Timer('[random.randint(0,1000) for r in xrange(10000)]','import random') # v1
t2 = timeit.Timer('random.sample(range(1000), 10000)','import random') # v2
print t1.timeit(1000)/1000
print t2.timeit(1000)/1000
v2 est plus rapide que v1, mais ne fonctionne pas une si grande échelle. Il donne l'erreur suivante: « ValueError: plus grand échantillon de population »
Connaissez-vous une solution rapide et efficace qui fonctionne à cette échelle?
Edit:
Andrew: ,000290962934494
gnibbler de: ,0058455221653
KennyTM de: ,00219276118279
NumPy est venu, a vu, conquis
Merci!
Bien sûr, cela ne fonctionne pas. 'random.sample()' épuise la population, rendant les nombres de moins en moins aléatoires. Une fois que la population entière est épuisée, il est impossible d'échantillonner davantage. –
Quand vous dites que c'est à des fins de test, combien de temps dureront les tests? –
Pour les simulations, où le temps est une exigence (mais la cryptographie et la sécurité ne le sont pas), un [Générateur de congruence linéaire (LCG)] (https://en.wikipedia.org/wiki/Linear_congruential_generator) est souvent utilisé. Je crois qu'un [Mersenne Twister] (https://en.wikipedia.org/wiki/Mersenne_Twister) est rapide (mais plus lent que LCG), et il fournit une distribution uniforme, si je me souviens bien. – jww