Me gustaría crear una lista aleatoria de enteros para propósitos de prueba. La distribución de los números no es importante. Lo único que cuenta es tiempo. Sé que generar números aleatorios es una tarea que consume tiempo, pero debe haber una mejor manera.Crear lista aleatoria de enteros en Python
aquí está mi solución actual:
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 es más rápido que v1, pero no funciona tan gran escala. Se da el siguiente error: 'ValueError: muestra más grande que la población '
¿Sabe usted una solución rápida y eficiente que trabaja en esa escala?
Editar:
de Andrew: ,000290962934494
de gnibbler: 0.0058455221653
de KennyTM: 0.00219276118279
NumPy vino, vio, venció
Gracias!
Por supuesto que no funciona. 'random.sample()' agota la población, haciendo que los números sean cada vez menos aleatorios. Una vez que toda la población se agota, es imposible seguir probando. –
Cuando dice que es para fines de prueba, ¿cuánto tiempo durará la prueba? –
Para simulaciones, donde el tiempo es un requisito (pero la criptografía y la seguridad no lo son), a menudo se usa [Generador congruente lineal (LCG)] (https://en.wikipedia.org/wiki/Linear_congruential_generator). Creo que [Mersenne Twister] (https://en.wikipedia.org/wiki/Mersenne_Twister) es rápido (pero más lento que LCG) y proporciona una distribución uniforme, si no recuerdo mal. – jww