Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create random list of integers in Python

I'd like to create a random list of integers for testing purposes. The distribution of the numbers is not important. The only thing that is counting is time. I know generating random numbers is a time-consuming task, but there must be a better way.

Here's my current solution:

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 is faster than v1, but it is not working on such a large scale. It gives the following error:

ValueError: sample larger than population

Is there a fast, efficient solution that works at that scale?

Some results from the answer

Andrew's: 0.000290962934494

gnibbler's: 0.0058455221653

KennyTM's: 0.00219276118279

NumPy came, saw, and conquered.

like image 364
Stiggo Avatar asked Nov 13 '10 10:11

Stiggo


People also ask

How do you generate random 50 numbers in Python?

The randint() method to generates a whole number (integer). You can use randint(0,50) to generate a random number between 0 and 50. To generate random integers between 0 and 9, you can use the function randrange(min,max) .

How do you randomly list in Python?

Use the random. sample() function when you want to choose multiple random items from a list without repetition or duplicates. There is a difference between choice() and choices() . The choices() was added in Python 3.6 to choose n elements from the list randomly, but this function can repeat items.


2 Answers

It is not entirely clear what you want, but I would use numpy.random.randint:

import numpy.random as nprnd import timeit  t1 = timeit.Timer('[random.randint(0, 1000) for r in xrange(10000)]', 'import random') # v1  ### Change v2 so that it picks numbers in (0, 10000) and thus runs... t2 = timeit.Timer('random.sample(range(10000), 10000)', 'import random') # v2 t3 = timeit.Timer('nprnd.randint(1000, size=10000)', 'import numpy.random as nprnd') # v3  print t1.timeit(1000)/1000 print t2.timeit(1000)/1000 print t3.timeit(1000)/1000 

which gives on my machine:

0.0233682730198 0.00781716918945 0.000147947072983 

Note that randint is very different from random.sample (in order for it to work in your case I had to change the 1,000 to 10,000 as one of the commentators pointed out -- if you really want them from 0 to 1,000 you could divide by 10).

And if you really don't care what distribution you are getting then it is possible that you either don't understand your problem very well, or random numbers -- with apologies if that sounds rude...

like image 58
Andrew Jaffe Avatar answered Sep 21 '22 18:09

Andrew Jaffe


All the random methods end up calling random.random() so the best way is to call it directly:

[int(1000*random.random()) for i in xrange(10000)] 

For example,

  • random.randint calls random.randrange.
  • random.randrange has a bunch of overhead to check the range before returning istart + istep*int(self.random() * n).

NumPy is much faster still of course.

like image 27
John La Rooy Avatar answered Sep 19 '22 18:09

John La Rooy