Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: How to generate a 12-digit random number?

Tags:

python

In Python, how to generate a 12-digit random number? Is there any function where we can specify a range like random.range(12)?

import random
random.randint()

The output should be a string with 12 digits in the range 0-9 (leading zeros allowed).

like image 469
Rajeev Avatar asked Nov 21 '12 15:11

Rajeev


People also ask

How do you generate a random large number in Python?

Random integers can be generated using functions such as randrange() and randint(). Let us first take a look at randint(). In case you want to generate numbers in intervals, you can use the randrange() function.


2 Answers

Whats wrong with a straightforward approach?

>>> import random
>>> random.randint(100000000000,999999999999)
544234865004L

And if you want it with leading zeros, you need a string.

>>> "%0.12d" % random.randint(0,999999999999)
'023432326286'

Edit:

My own solution to this problem would be something like this:

import random

def rand_x_digit_num(x, leading_zeroes=True):
    """Return an X digit number, leading_zeroes returns a string, otherwise int"""
    if not leading_zeroes:
        # wrap with str() for uniform results
        return random.randint(10**(x-1), 10**x-1)  
    else:
        if x > 6000:
            return ''.join([str(random.randint(0, 9)) for i in xrange(x)])
        else:
            return '{0:0{x}d}'.format(random.randint(0, 10**x-1), x=x)

Testing Results:

>>> rand_x_digit_num(5)
'97225'
>>> rand_x_digit_num(5, False)
15470
>>> rand_x_digit_num(10)
'8273890244'
>>> rand_x_digit_num(10)
'0019234207'
>>> rand_x_digit_num(10, False)
9140630927L

Timing methods for speed:

def timer(x):
        s1 = datetime.now()
        a = ''.join([str(random.randint(0, 9)) for i in xrange(x)])
        e1 = datetime.now()
        s2 = datetime.now()
        b = str("%0." + str(x) + "d") % random.randint(0, 10**x-1)
        e2 = datetime.now()
        print "a took %s, b took %s" % (e1-s1, e2-s2)

Speed test results:

>>> timer(1000)
a took 0:00:00.002000, b took 0:00:00
>>> timer(10000)
a took 0:00:00.021000, b took 0:00:00.064000
>>> timer(100000)
a took 0:00:00.409000, b took 0:00:04.643000
>>> timer(6000)
a took 0:00:00.013000, b took 0:00:00.012000
>>> timer(2000)
a took 0:00:00.004000, b took 0:00:00.001000

What it tells us:

For any digit under around 6000 characters in length my method is faster - sometimes MUCH faster, but for larger numbers the method suggested by arshajii looks better.

like image 124
Inbar Rose Avatar answered Sep 20 '22 15:09

Inbar Rose


Do random.randrange(10**11, 10**12). It works like randint meets range

From the documentation:

randrange(self, start, stop=None, step=1, int=<type 'int'>, default=None, maxwidth=9007199254740992L) method of random.Random instance
    Choose a random item from range(start, stop[, step]).

    This fixes the problem with randint() which includes the
    endpoint; in Python this is usually not what you want.
    Do not supply the 'int', 'default', and 'maxwidth' arguments.

This is effectively like doing random.choice(range(10**11, 10**12)) or random.randint(10**1, 10**12-1). Since it conforms to the same syntax as range(), it's a lot more intuitive and cleaner than these two alternatives

If leading zeros are allowed:

"%012d" %random.randrange(10**12)
like image 27
inspectorG4dget Avatar answered Sep 21 '22 15:09

inspectorG4dget